Java注解与反射

Java注解与反射

注解Annotation

  • 从JDK5.0开始引入

作用

  • 不是程序本身,可以对程序作出解释
  • 可以被其他程序(如:编译器)读取

格式

  • @注释名(参数)

使用方式

  • 可以附加在package、class、method、field等上
  • 通过反射机制编程实现对这些元数据的访问

内置注解

  • @Override:重写
  • @Deprecated:不鼓励使用
  • @SuppressWarnings:通过添加参数抑制编译时的警告

元注解

负责注解其他注解

  • @Target:描述注解的适用范围
  • @Retention:描述需要在什么级别保存该注释信息,即生命周期
    • (SOURSE < CLASS < RUNTIME)
  • @Document:说明该注解将被包含在javadoc中
  • @Inherited:说明子类可以继承父类中的该注解

自定义注解

  • 使用@interface自定义注解
  • 其中的每一个方法实际上是声明了一个配置参数
  • 方法的名称就是参数的名称
  • 返回值类型就是参数的类型
  • 可以通过default声明参数的默认值
  • 如果只有一个参数,一般为value
  • 注解元素必须要有值,定义时使用空字符串或0作为默认值

反射Reflection

  • 反射机制允许程序在执行期间获取任何类的内部信息,并能直接操作任意对象的内部属性及方法

    • Class c = Class.forName("java.lang.String");
      
  • 反射方式通过实例化对象的getClass()方法,得到完整的"包类"名称

功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时获取泛型信息
  • 在运行时调用任意一个对象的成员变量和方法
  • 在运行时处理注解
  • 生成动态代理
  • ......

Class类常用方法

  • static ClassforName(String name)
  • Object newInstance()
  • getName()
  • Class getSuperClass()
  • Class[] getInterfaces()
  • ClassLoader getClassLoader()
  • Constructor[] getConstructors()
  • Method getMethed(String name, Class.. T)
  • Field[] getDeclaredFields()

获取Class实例的方法

  1. 类的class属性
  2. 实例的getClass()方法
  3. Class.forName("...")
  4. 内置基本数据类型的包装类.TYPE
  5. 利用ClassLoader

安全检查

  • setAccessible
  • 可以操作private属性、方法等

获取泛型

获取注解

posted @ 2021-01-18 17:04  一天到晚睡觉的鱼  阅读(78)  评论(0)    收藏  举报