反射章节练习
-
练习1:通过反射修改私有成员变量
- 定义PrivateTest类,有私有name属性,并且属性值为helloKitty
- 提供getName的公有方法
- 创建PrivateTest的类,利用Class类得到私有的name属性,修改私有的name属性值,并调用getName()的方法打印name属性值
Exercise01.java
package com22.exercise;import java.lang.reflect.Field;
import java.lang.reflect.Method;/*** @ClassName Exercise01* @Description 通过反射修改私有成员变量* @Author 甲柒* @Date 2023/9/13 20:11* @Version 1.0**/
public class Exercise01 {public static void main(String[] args) throws Exception {/*定义PrivateTest类,有私有name属性,并且属性值为helloKitty提供getName的公有方法创建PrivateTest的类,利用Class类得到私有的name属性,修改私有的name属性值,并调用getName()的方法打印name属性值*/Class<?> aClass = Class.forName("com22.exercise.PrivateTest");Object o = aClass.newInstance();Field name = aClass.getDeclaredField("name");name.setAccessible(true);System.out.println(name.get(o));//只得到private的nameSystem.out.println("++++++++++++++++++++++++++++++++++++++++++++");//1.得到PrivateTest类对应的Class对象Class<PrivateTest> privateTestClass = PrivateTest.class;//2.创建对象实例PrivateTest privateTestObj = privateTestClass.newInstance();//3.得到name属性对象Field name1 = privateTestClass.getDeclaredField("name");//name属性是private//4.暴破name1.setAccessible(true);name1.set(privateTestObj, "加菲猫");//5.得到getName方法对象Method getName = privateTestClass.getMethod("getName");//6.因为getName() 是public,所有直接调用Object invoke = getName.invoke(privateTestObj);System.out.println("name属性的值=" + invoke);//加菲猫}
}class PrivateTest {private String name = "helloKitty";//默认无参构造器public String getName() {return name;}
}
运行结果
-
练习2:利用反射和File完成以下功能
- 利用Class类的forName方法得到File类的class对象
- 在控制台打印File类的所有构造器
- 通过newInstance的方法创建File对象,并创建E:\mynew.txt文件
提示:创建文件的正常写法如下:
File file = new File("d:\\aa.txt");
file.createNewFile();
Exercise02.java
package com22.exercise;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;/*** @ClassName Exercise02* @Description 利用反射和File完成以下功能* @Author 甲柒* @Date 2023/9/13 20:55* @Version 1.0**/
public class Exercise02 {public static void main(String[] args) throws Exception {/*** 利用Class类的forName方法得到File类的class对象* 在控制台打印File类的所有构造器* 通过newInstance的方法创建File对象,并创建E:\java_study\011-study\src\com22\exercise\myNew.txt文件*///1.Class类的forName方法得到File类的class对象Class<?> fileCls = Class.forName("java.io.File");//2.得到所有构造器Constructor<?>[] declaredConstructors = fileCls.getDeclaredConstructors();//遍历输出for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println("File的所有构造器=" + declaredConstructor);}//3.单独得到public java.io.File(java.lang.String)Constructor<?> declaredConstructor = fileCls.getDeclaredConstructor(String.class);String fileAllPath = "E:\\java_study\\011-study\\src\\com22\\exercise\\myNew.txt";Object file = declaredConstructor.newInstance(fileAllPath);//创建File对象//4.得到createNewFile的方法对象Method createNewFile = fileCls.getMethod("createNewFile");createNewFile.invoke(file);//创建文件,调用的是createNewFile//file的运行类型就是FileSystem.out.println(file.getClass());System.out.println("创建文件成功~~~~" + fileAllPath);}
}
运行结果