Java注解与反射

1.注解annotation:可以被编译器读取

2.从Java1.5开始引入。

3。Java内置注解:

  • @Deprecated 已过期,表示方法是不被建议使用的
  • @Override 重写,标识覆盖它的父类的方法
  • @SuppressWarnings 压制警告,抑制警告(需要加参数)

4.Java除了内置了三种标准注解,还有四种元注解。

@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:

     ElemenetType.CONSTRUCTOR-----------------------------构造器声明 
     ElemenetType.FIELD ----------------------------------域声明(包括 enum 实例) 
     ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明 
     ElemenetType.METHOD ---------------------------------方法声明 
     ElemenetType.PACKAGE --------------------------------包声明 
     ElemenetType.PARAMETER ------------------------------参数声明 
     ElemenetType.TYPE----------------------------------- 类,接口(包括注解类型)或enum声明 


@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:

     RetentionPolicy.SOURCE-------------注解将被编译器丢弃 
     RetentionPolicy.CLASS -------------注解在class文件中可用,但会被VM丢弃 
     RetentionPolicy.RUNTIME ---------VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。


@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。

@Inherited 允许子类继承父类中的注解。

5.元注解实例

 

 

 

 6.自定义注解  以及注解参数

 

 

7.

  • 动态语言(弱类型语言)是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。比如Php、Asp、JavaScript、Python、Perl等等。
var s ="hello";
var i = 0;
var b = true;
  • 静态语言(强类型语言)是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须生命数据类型。比如Java、C、C++、C#等。

8。Java也有var为什么Java还是强类型语言呢?

var不是关键字,它相当于是一种动态类型;
var动态类型是编译器根据变量所赋的值来推断类型;
var 没有改变Java的本质,var只是一种简便的写法,
就是说在定义局部变量时,任意什么类型都可以用var定义变量的类型会根据所赋的值来判断。

9。用var声明变量的注意事项:
1,var只能在方法内定义变量,不允许定义类的成员变量。
2,var 定义变量必须赋初始值,------》以后不能在赋初始值。
3,var每次只能定义一个变量,不能复合声明变量。

 

10.反射:在jvm加载完类之后,会为每一个类生成一个class对象,这个class对象包含了完整的结构信息,可以通过class对象得出类的结构。

相当于 镜子。

11.

 

 12.

 

 13.反射后可以得到的信息:

某个类的属性、方法、构造器,实现了哪些接口,

14.

 

 15.

 

 

 

 16.

 他们的class对象是什么

 

 

 

 

 17.反射的API

 constructor.newInstance();
        
        /**
         * 获取方法
         * 
         */
        //获取___类中所有的public修饰的方法,其中包括父类的方法。
        //如果还要获取所有的方法用getDeclaredMethods()方法
        Method[] methods = rName.getMethods();
        //获取___指定的方法,这获取的是无参方法,
        //要获取有参的请在行参列表上写上(指定的方法名,数据类型1.class,数据类型2.class);
        Method method = rName.getMethod(方法名);
        //调用___非static修饰的方法需要invoke(对象,实参1,实参2),
        //有static修饰的方法需要invoke(null,实参1,实参2)。
        //我这调用的非static修饰方法没有参数就只需一个对象
        method.invoke(newInstance);
        /**
         * 获取字段
         * 
         */
        //获取___类中的public字段。如果还要获取所有的字段用getDeclaredFields()方法
        Field[] fields = rName.getFields();
        //获取___指定的字段。
        Field field = rName.getDeclaredField(指定的字段名);
        //设置___指定的字段,非static修饰,set(对象,值);有static修饰,set(null,值)
        field.set(newInstance,5.2);
        //调用___指定字段的值,非static修饰,get(对象);有static修饰,get(null)
        Object object = field.get(newInstance);
        System.out.println("指定字段的值=="+object);
        
        /**
         * 破坏包装declaredField.setAccessible(boolean)破坏封装,可以调用私有成员
         * true:破环
         * false:默认值,不破坏
         */
        Field field2 = rName.getDeclaredField(私有化的字段名);
        //破坏封装,不让字段私有化
        field2.setAccessible(true);
        //设置字段的值
        field2.set(newInstance,值);
        //调用设置后的字段值,并打印
        Object object2 = field2.get(newInstance);
        System.out.println("破坏封装==="+object2);
        
        //获取全限定类名
        String name = rName.getName();
        System.out.println("全限定类名: "+name);
        
        //获取类名简写
        String simpleName = rName.getSimpleName();
        System.out.println("类名简写: "+simpleName);

 

18.在这个实例下 输出两个hashCode值相等

 

 

19.根据class对象新建一个对象(无参构造器)

 

 新建一个有参构造器生成一个对象

 

 通过反射 得到方法method 然后使用invoke进行传参

 

 

通过反射得到属性 然后进行赋值。要记得打开可达性

 

 19.通过反射获得注解的信息(包括注解的value值等)

 

 

 

 

 

 

 

 

 

posted @ 2021-01-26 08:49  枫叶像思念  阅读(91)  评论(0编辑  收藏  举报