Java注解与反射

一 、注解

1.一些内置注解

@Override,@Deprecated

2.元注解

元注解的作用就是负责注解其他注解
4个标准元注解(meta-annotation)
(1)@Target:描述注解的使用范围(类,方法…)
(2)@Retention:表示需要在什么级别保存改注释信息,用于描述注解的生命周期(SOURCE<CALSS<RUNTIME)
(3)@Document:说明该注解将被包含在javadoc中
(4)@Inherited:说明字类可以继承父类中的该注解

3.自定义注解

使用@interface自定义注解
(1)注解的参数定义参数类型+参数名+(),default表示默认
(PS 如果int类型的默认值为-1,则默认不存在)

@interface testannotation
    {
        //注解的参数
        String name() default "";`

@testannotation(name = "张大炮")
    public void testannotation()
    {

    }

二、反射

首先了解一下静态和动态语言
在这里插入图片描述
在这里插入图片描述
反射的优缺点:
反射可以实现动态创建对象和编译,灵活
对性能有影响。使用反射本质上是一种解释操作,我们可以告诉jvm要做什么,这类操作总是慢于直接执行相同的操作

1.Class类

Class类是java反射的源头
Jre为每一个类都保留一个不变的Class类型的对象,当类Load时候,类的class文件读入内存,并为之创建一个Class对象
关于Class类
在这里插入图片描述
在这里插入图片描述

获取Class类的实例方法:
a)已知具体的类,通过类获得
Class a = Person.class;
b)已知某个类的实例
Class b = person.getClass();
c)已知全类名
Class c = Class.forName(全类名)
d)基本内置类型的包装类都有一个Type属性
Class d = Integer.TYPE;

2.通过反射动态创建对象

Class c1 = Class.forName("com.user")
User user = (user) c1.newInstance();//调用无参构造器

通过构造器构造

Constructor con = c1.getDeclaredConstructor(参数类.class。。)
User user2 = (user) con.newInstance(参数);

3.通过反射获得一个方法

Method setName = con.getDeclaredMethod(“方法名”,参数类.class…)
setName.invoke(对象,参数)//执行

4.通过反射操作属性

User user4 =(user) c1.newInstance();
Field name = c1.getDeclaredField("name");
//不能直接操作私有属性
name.setAccessible(true);//设置访问权限
name.set(user4,"大炮");

5.通过反射获取泛型信息

重要!6.通过反射获取注解

(a)获得类的注解

Class aClass = Class.forName("reflection.student");
        Annotation[] annotations = aClass.getAnnotations();
        for (Annotation a :
                annotations) {
            System.out.println(a);
        }
        Tablestu annotation = (Tablestu)aClass.getAnnotation(Tablestu.class);
        System.out.println(annotation.value());

(b)获得属性的注解

Field name = aClass.getDeclaredField("name");
        Fieldstu f = name.getAnnotation(Fieldstu.class);
        System.out.println(f);


版权声明:本文为weixin_44898959原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。