反射

  • Class 类本身
  • Package 类所在的包
  • Field 类中的属性
  • Method 类中的方法
  • Constructor 类中的构造方法
  • Annotation 类中的注解

1. 如何获取Class

Class c = Class.forName("包名.类名");
Class c = 类名.Class;
String s = 对象.getClass(); //Object类的方法

2. Class中常用方法

//返回值类型 ->方法
int ->getModifiers();           //获取类的修饰符(权限 特征)
    // 0 1 2 4 8 16 32 64 128 256 512 1024 
    // 默认不写 public private protected  static final synchronized volatile transient native interfase abstract
String  ->getName();             //获取类的全名 (包名+类名)
String  ->getsimpleName();       //获取类的简单名 (类名)
Package ->getPackage();          //获取类所在的包
Class   ->getSuperClass();       //获取父类
Class[] ->getInterfaces();       //获取接口
Class[] ->getClasses();          //获取类中的内部类 (只能获取public修饰的)
Object  ->newInstance();         //通过Class创建对象相当于调用无参数构造方法若不存在无参数构造方法则抛出异常

//属性相关
    Filed   ->getFiled("属性名");     //通过属性名获取属性名(只能共有的)
    Filed[] ->getFileds();           //获取属性名(只能共有的)
    Filed   ->getDeclaredField("属性名"); //通过属性名获取共有+私有属性不能获取父类的
    Filed[] ->getDeclaredFields();   //获取所有共有+私有属性不能获取父类的

//方法相关
    Method   ->getMethod("方法名", String 参数); //通过方法名及参数寻找方法 找不到抛出异常
    Method[] ->getMethod(); //获取所有的公有方法 包括父类的
    Method   ->getDeclaredField("方法名");//通过方法名获取共有+私有方法不能获取父类的
    Method[] ->getDeclaredFields();//获取所有共有+私有方法不能获取父类的

//构造方法相关
    Constructor   ->getConstructor(构造方法的参数类型对应的Class);//通过构造方法的参数类型对应的Class获取构造方法 eg:getConstructor(String.class); 获取带String类型参数的构造方法
    Constructor[] ->getConstructors();
    Method        ->getDeclaredConstructor(构造方法的参数类型对应的Class);//通过构造方法的参数类型对应的Class获取共有+私有构造方法不能获取父类的
    Method[]      ->getDeclaredConstructors();//获取所有共有+私有构造方法不能获取父类的

3. Field类中的方法

//返回值类型 ->方法
//获取属性的属性
    int    ->getModifiers();           //获取属性的修饰符(权限 特征)
    Class  ->getType();              //获取属性的类型对应的那个class
    String ->getName();             //获取属性名
//操作属性
    set(对象,值);                   //给对象的属性赋值,如果是私有属性应该先设置Accessible
    Object ->get(对象);             //从对象获取属性的值
    //私有属性不能直接操作
    setAccessible(true);            //设置私有属性可以被修改

4. Method类中的方法

int     ->getModifiers();           //获取方法的修饰符(权限 特征)
Class   ->getReturnType();        //获取方法的类型对应的那个class
String  ->getName();             //获取方法名
Class[] ->getParameterTypes();  //获取方法的参数列表类型
Class[] ->getExceptionTypes();  //获取方法抛出异常的类型

//操作方法
    invoke(对象,...args:参数);  //执行方法  (执行方法的对象,执行方法的所有参数)
    //私有方法不能直接操作
    setAccessible(true);            //设置私有方法可以被修改

5.Constructor类中的方法

int     ->getModifiers();           //获取构造方法的修饰符(权限 特征)
String  ->getName();             //获取构造方法名
Class[] ->getParameterTypes();  //获取构造方法的参数列表类型
Class[] ->getExceptionTypes();  //获取构造方法抛出异常的类型