Java 反射

反射:通过Class实例获取class信息的方法称为反射,
Class实例:保存了某个class的所有信息。如果获取了某个Class实例,就能获取其对应的class的所有信息。Class实例在JVM中唯一。
获取一个class的Class实例方法(以String为例):
1——Class cls = String.class
2——String s = “Hello”
Class cls = s.getClass()
3——Class cls = Class.forName(“java.lang.String”)//知道一个class的完整类名

一、访问字段Field

Field getField(name)//根据字段获取某个public的field(包括父类)
Field getDeclaredField(name)//根据字段获取当前类的某个field(不包括父类)
Field getFields()//获取所有public的field(包括父类)
Field getDeclaredFields()//获取当前类的所有field(不包括父类)
——调用对象为Class

      Class stdClass = Student.class;//Student为一个类
      // 获取public字段"score":
      System.out.println(stdClass.getField("score"));
      // 获取继承的public字段"name":
      System.out.println(stdClass.getField("name"));

getName():返回字段名称,例如,“name”;
getType():返回字段类型,也是一个Class实例,例如,String.class;
getModifiers():返回字段的修饰符,它是一个int,不同的bit表示不同的含义。
——调用对象为Field
Field.get(Object)//获取某个字段的值
Field.set(ObjectA,ObjectB)//设置ObjectA的值为ObjectB
Field.setAccessible(true)//设置某个字段可访问,可能返回false

public class Test {
    public static void main(String[] args) throws Exception {
        Object p = new Person("Jack");//new 对象
        Class c = p.getClass();//获取Class
        Field f = c.getDeclaredField("name");//获取Field
        f.setAccessible(true);//设备可访问
        Object value = f.get(p);//获取值
    }
}

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }
}

二、访问方法

Method getMethod(name, Class)//获取某个public的Method(包括父类),后面的Class为该方法的参数
Method getDeclaredMethod(name,Class)//获取当前类的某个Method(不包括父类)
Method[] getMethods()//获取所有public的Method
Method[] getDeclaredMethods()//获取当前类的所有Method
——调用对象为Class
getName():返回方法名称,例如:“getScore”;
getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class;
getParameterTypes():返回方法的参数类型,是一个Class数组,例如:{String.class, int.class};
getModifiers():返回方法的修饰符,它是一个int,不同的bit表示不同的含义。
——调用对象为Method
对Method实例调用invoke就相当于调用该方法,invoke的第一个参数是对象实例,后面的可变参数要与方法参数一致,如果方法为静态方法,第一个参数为null。
Method.setAccessible(true)//设置某个字段可访问,可能返回false

public class Test {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        Method m = p.getClass().getDeclaredMethod("setName", String.class);//获取Method
        m.setAccessible(true);//设置可访问
        m.invoke(p, "Jack");//调用方法
    }
}

class Person {
    String mName;
    private void setName(String name) {
        mName = name;
    }
}

你可能感兴趣的:(java,&,kotlin,java,jvm,开发语言)