注解和反射

注解

  • 作用
    1. 不是程序本身,可以对程序作出解释
    2. 可以被其他程序(如:编译器等)读取
  • 格式:以“@注释名”在代码中存在,还可以添加一些参数值
    例:@Override、@SuppressWarnings(value="unchecked")
  • 自定义注解
//自定义注解
public class TestAnnotation {
    //如果没有默认值,就必须给注解赋值
    @MyAnnotation01(age = 1)
    public void test01() {
    }
}

//元注解
//@Target 用于描述注解的使用范围
@Target({ElementType.TYPE, ElementType.METHOD})
//@Retention 用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation01 {
    //注解的参数:参数类型 + 参数名();
    //default 默认值
    String value() default "";
    int age();
    int id() default -1;
    String[] schools() default {"哈士奇", "泰迪"};
}

反射

  • 得到Class类的方法
    1. 直接通过一个class的静态变量class获取:
      Class cls = String.class;
    2. 如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
      String s = "Hello";
      Class cls = s.getClass();
    3. 如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:
      Class cls = Class.forName("java.lang.String");
  • 调用构造方法
    getConstructor(Class...):获取某个public的Constructor
    getDeclaredConstructor(Class...):获取某个private和public的Constructor
    getConstructors():获取所有public的Constructor
  • 调用方法
    Method getMethod(name, Class...):获取某个public的Method(包括父类)
    Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
    Method[] getMethods():获取所有public的Method(包括父类)
    Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)
  • 访问字段
    Field getField(name):根据字段名获取某个public的field(包括父类)
    Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
    Field[] getFields():获取所有public的field(包括父类)
    Field[] getDeclaredFields():获取当前类的所有field(不包括父类)