Java注解与反射

    科技2022-08-09  97

    一 、注解

    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);
    Processed: 0.021, SQL: 8