Java注解、反射

137 阅读2分钟

注解

注解和注释的区别

注解和注释都是给程序员看的,但注解可以给程序看,甚至可以被其他程序读取(通过反射)

  1. 内置注解
    • @Override:只能修饰方法,表示这个方法将要重写父类中的方法
    • @Deprecated:可以修饰类、方法、属性,表示不鼓励程序员使用这样的元素
    • @SuppressWarnings:抑制编译警告,需要参数,一般为all
  2. 元注解:注解其他注解
    • @Target:描述注解的使用范围
    • @Retention:描述注解的生命周期(一般自定义用RUNTIME)
    • @Document:说明该注释将被包含在javadoc文档中
    • @Inherited:说明子类可以继承父类的中该注解
  3. 自定义注解 public @interface 注解名{定义内容}
  4. 解析注解:获取注解中定义的属性值
    • 获取注解定义的位置的对象(Class、Method、Field)
    • 获取指定的注解getAnnotation(Class)
    • 调用注解中的抽象方法获取配置的属性值

反射

动态语言是指在程序运行的时候可以改变程序结构,反射是Java被视为动态语言的关键。

  1. 获取class对象的方式
    • Class.forName("全类名")
    • 类名.class
    • 对象.getClass()
    • 同一个字节码文件在一次程序运行过程中,在会被加载到内存中一次,因此无论通过哪种方式获取的class对象都是同一个
  2. class对象功能
    • 获取成员变量
      • Field[] getFields():获取所有public修饰的成员变量
      • Field getField(String name):获取指定名称的public修饰的成员变量
      • Field[] getDeclaredFields():获取所有修饰符的成员变量
      • Field getDeclaredField(String name)获取指定名称的所有修饰符的成员变量
    • 获取构造方法(同上)
    • 获取成员方法(同上)
    • 获取类名 String getName()
  3. Field对象的相关操作(其他类似)
    • 设置值void set(Object object, Object value)
    • 获取值get(Object obj)
    • 忽略权限修饰符的安全检查setAccessible(true)暴力反射