Java反射

Java反射相关,占坑. 花火!

关于Class类和类的类型

类是java.lang.Class类的实例对象,而Class是所有类的类
由于Class的构造函数是私有的,所以如果想获取一个类,可以通过一个已有类得到Class的对象

Class c1 = Code.class;
这说明任何一个类都有一个隐含的静态成员变量class,这种方式是通过获取类的静态成员变量class得到的
Class c2 = code1.getClass();
code1Code的一个对象,这种方式是通过一个类的对象的getClass()方法获得的
Class c3 = Class.forName("com.trigl.reflect.Code");
这种方法是Class类调用forName方法,通过一个类的全量限定名获得

Java反射相关的骚操作

  • 获取成员方法Method
    java.lang.reflect.Method;
    以下是Class对象获取方法的方法
    public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 得到该类所有的方法,不包括父类的
    public Method[] getDeclaredMethods(...)
    public Method getMethod(String name, Class<?>... parameterTypes) // 得到该类所有的public方法,包括父类的
    public Method[] getMethods(...)
    

    实例:

    Class c = Class.forName("com.reflect.Person");  //先生成class
    Object o = c.newInstance();                     //newInstance可以初始化一个实例
    Method method = c.getMethod("setNameAndId", String.class, int.class);//获取方法
    method.invoke(o, "yumao", 10);					//通过invoke调用该方法,参数第一个为实例对象,后面为具体参数值
    
  • 获取成员变量Field
    java.lang.reflect.Field;
    public Field getDeclaredField(String name) // 获得该类自身声明的所有变量,不包括其父类的变量
    public Field[] getDeclaredFields(...)
    public Field getField(String name) // 获得该类自所有的public成员变量,包括其父类变量
    public Field[] getFields(...)
    

    实例

    Class c = a.getClass();
    Field field = c.getDeclaredField("name");
    Object o = c.newInstance();
    Object msg = field.get(o);
    
  • 获取构造函数Constructor
    java.lang.reflect.Constructor;
    public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //  获得该类所有的构造器,不包括其父类的构造器
    public Constructor<T>[] getDeclaredConstructors(...)
    public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获得该类所以public构造器,包括父类
    public Constructor<T>[] getConstructors(...)
    

    实例

    // 构造函数
    public A(String a, int b) {
      // code body
    }
    // 获取构造函数
    Constructor constructor = a.getDeclaredConstructor(String.class, int.class);