调用指定的属性

  1. 通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性
  2. setAccessible(true):确保此属性是可以访问的
  3. 通过Filed类的实例调用get(Object obj) (获取的操作)
    或 set(Object obj,Object value) (设置的操作)进行操作。

调用私有属性

调用private String name

public void test2() throws Exception {
    Class clazz = Person.class;

    //创建Person实例对象
    Person per = (Person) clazz.newInstance();

    //1.通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性
    Field nameField = clazz.getDeclaredField("name");

    //2. setAccessible(true):确保此属性是可以访问的
    nameField.setAccessible(true);

    //3. 通过Filed类的实例调用get(Object obj) (获取的操作)
    // 或 set(Object obj,Object value) (设置的操作)进行操作。
    nameField.set(per,"Tom");
    System.out.println(nameField.get(per));
}

调用静态私有属性

public void test3() throws Exception {
    Class clazz = Person.class;

    //1.通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性
    Field infoField = clazz.getDeclaredField("info");

    //2. setAccessible(true):确保此属性是可以访问的
    infoField.setAccessible(true);

    //3. 通过Filed类的实例调用get(Object obj) (获取的操作)或 set(Object obj,Object value) (设置的操作)进行操作。
    
    //方式一
    infoField.set(Person.class,"我是一个人");
    System.out.println(infoField.get(Person.class));

    // 方式二
    infoField.set(null,"我是一个人"); //仅限于类变量可以如下的方式调用
    System.out.println(infoField.get(null)); //仅限于类变量可以如下的方式调用
}

调用指定的方法

  1. 通过Class的实例调用getDeclaredMethod(String methodName,Class … args),获取指定的方法
  2. setAccessible(true):确保此方法是可访问的
  3. 通过Method实例调用invoke(Object obj,Object … objs),即为对Method对应的方法的调用。
    invoke()的返回值即为Method对应的方法的返回值
    特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null

调用私有方法

public void test4() throws Exception {
    Class clazz = Person.class;

    Person per = (Person) clazz.newInstance();

    //1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法,int.class和Integer.class的类类型不一样
    Method showNationMethod = clazz.getDeclaredMethod("showNation",String.class,int.class);

    //2. setAccessible(true):确保此方法是可访问的
    showNationMethod.setAccessible(true);

    //3.通过Method实例调用invoke(Object obj,Object ... objs),即为对Method对应的方法的调用。
    //invoke()的返回值即为Method对应的方法的返回值
    //特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null
    Object returnValue = showNationMethod.invoke(per,"CHN",10);
    System.out.println(returnValue);
}

调用私有静态方法

public void test5() throws Exception {
    Class clazz = Person.class;

    //1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法
    Method showInfoMethod = clazz.getDeclaredMethod("showInfo");

    //2. setAccessible(true):确保此方法是可访问的
    showInfoMethod.setAccessible(true);

    //3.通过Method实例调用invoke(Object obj,Object ... objs),即为对Method对应的方法的调用。
    //invoke()的返回值即为Method对应的方法的返回值
    //特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null
    Object returnValue = showInfoMethod.invoke(null);
    System.out.println(returnValue);
}

调用指定的构造器

  1. 通过Class的实例调用getDeclaredConstructor(Class … args),获取指定参数类型的构造器
  2. setAccessible(true):确保此构造器是可以访问的
  3. 通过Constructor实例调用newInstance(Object … objs),返回一个运行时类的实例。

调用构造器

public void test6() throws Exception {

    Class clazz = Person.class;

    //1.通过Class的实例调用getDeclaredConstructor(Class ... args),获取指定参数类型的构造器
    //Constructor constructor = clazz.getDeclaredConstructor();
    Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);

    //2.setAccessible(true):确保此构造器是可以访问的
    constructor.setAccessible(true);

    //3.通过Constructor实例调用newInstance(Object ... objs),返回一个运行时类的实例。
    //Person per = (Person) clazz.newInstance(); //jdk9之后不推荐用了
    //Person per = (Person) constructor.newInstance(); //通过空参构造器,创建对象实例
    Person per = (Person) constructor.newInstance("Tom", 12);

    System.out.println(per);

}