美文网首页
2023-12-14 反射补充

2023-12-14 反射补充

作者: 大也 | 来源:发表于2023-12-13 22:40 被阅读0次

//********************如下是调用指定的属性************************
/*
* 反射的应用3-1:调用指定的属性
*
* */
//public int age = 1;
@Test
public void test1() throws Exception {
Class clazz = Person.class;

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

    //1. 获取运行时类指定名的属性
    Field ageField = clazz.getField("age");

    //2. 获取或设置此属性的值
    ageField.set(per,2);
    System.out.println(ageField.get(per));
}

//private String name;
@Test
public void test2() throws Exception {
    Class clazz = Person.class;

    //
    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));
}

//private static String info;
@Test
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));
}

//********************如下是调用指定的方法************************
/*
 * 反射的应用3-2:调用指定的方法
 *
 * */
//private String showNation(String nation,int age)
@Test
public void test4() throws Exception {
    Class clazz = Person.class;

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

    //1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法
    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 static void showInfo()
@Test
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);
}

//********************如下是调用指定的构造器************************
/*
 * 反射的应用3-3:调用指定的构造器
 *
 * */
//private Person(String name, int age)
@Test
public void test6() throws Exception {

    Class clazz = Person.class;

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

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

    //3.通过Constructor实例调用newInstance(Object ... objs),返回一个运行时类的实例。
    Person per = (Person) constructor.newInstance("Tom", 12);

    System.out.println(per);

}
//使用Constructor替换原有的使用Class调用newInstance()的方式创建对象
@Test
public void test7() throws Exception {
    Class clazz = Person.class;

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

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

    //3.通过Constructor实例调用newInstance(Object ... objs),返回一个运行时类的实例。
    Person per = (Person) constructor.newInstance();

    System.out.println(per);
}

相关文章

网友评论

      本文标题:2023-12-14 反射补充

      本文链接:https://www.haomeiwen.com/subject/wjrigdtx.html