知识点
反射(基础知识点),练习
-
写出获取Class实例的三种常见方式
①类名.class
②对象名.getClass()
③Class.forNmae(String className) -
谈谈你对Class类的理解
答:加载到内存中的运行时的类,这个类本身就是Class 类的一个对象,java 中不能 Class cla = Person; 这样写,就给Person 补充了一个属性 class,所以要获取Class的对象,就要Class cla = Person.class; 这样写。
可以这样理解:类本身就是一个对象是谁的对象呢,Class的对象。对应Java 万事万物皆对象。Class 这个类的对象不能new,需要运行时类来获取; -
利用反射和重载完成以下功能
1)创建Student类,类中有属性name和age并封装属性
2)重载Student的构造函数,一个是无参构造,另一个是带两个参数的有参构造,要求在构造函数打印提示信息
3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象
4)通过上述获取的Class对象分别调用Student有参函数和无参函数Student类
public class Student { //1)创建Student类,类中有属性name和age并封装属性 private String name; private int age; //2)重载Student的构造函数,一个是无参构造并,另一个是带两个参数的有参构造,要求在构造函数打印提示信息 public Student() { } public Student(String name, int age) { this.name = name; this.age = age; System.out.println("此乃提示信息!"); } }
测试类
//3)创建带main函数的NewInstanceTest(我创建的Work03)类,利用Class类得到Student对象 public class Work03 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //4)通过上述获取的Class对象分别调用Student有参函数和无参函数 //获取Class类 Class<?> aClass = Class.forName("Reflect_Work9_03.Student"); //调用无参函数并创建对象obj Constructor<?> constructor = aClass.getConstructor(); Object obj = constructor.newInstance(); //调用带参函数并创建对象obj1 Constructor<?> constructor1 = aClass.getConstructor(String.class, int.class); Object obj1 = constructor1.newInstance("林青霞",30); } }
-
利用反射的知识完成下面的操作
1)创建Mytxt类,创建myCreate()方法完成创建文件D:\myhello.txt文件的功能。创建带main方法的NewInstanceTest类,通过Class类获取Mytxt对象,调用myCreat()Mytxt类
public class Mytxt { public void myCreate() throws IOException { File file = new File("D:\\myhello.txt"); file.createNewFile(); } }
NewInstanceTest类
public class NewInstanceTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { //创建带main方法的NewInstanceTest类,通过Class类获取Mytxt对象,调用myCreat() Class<?> aClass = Class.forName("Reflect_Work9_04.Mytxt"); Constructor<?> constructor = aClass.getConstructor(); Object obj = constructor.newInstance(); Method method = aClass.getMethod("myCreate"); method.invoke(obj); } }
5.利用通过反射修改私有成员变量
-
定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法
-
创建带有main方法ReflectTest的类,利用Class类得到私有的name属性
-
修改私有的name属性值,并调用getName()的方法打印name属性值
PrivateTest类
// 定义PrivateTest类 public class PrivateTest { //有私有name属性,并且属性值为hellokitty, private String name="hellokitty"; //只提供name的getName的公有方法 public String getName() { return name; } }
ReflectTest类
//创建带有main方法ReflectTest的类 public class ReflectTest { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { //利用Class类得到私有的name属性 Class<?> aClass = Class.forName("Reflect_Work9_05.PrivateTest"); Object obj = aClass.newInstance(); Field name = aClass.getDeclaredField("name"); //修改私有的name属性值 //暴力映射属性 name.setAccessible(true); name.set(obj,"HelloKitty"); //并调用getName()的方法打印name属性值 Method getName = aClass.getDeclaredMethod("getName"); System.out.println(getName.invoke(obj)); } }
6.利用反射和File完成以下功能
1.利用Class类的forName方法得到File类
2.在控制台打印File类的所有构造器
3.通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
public class Work9_06 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
// 1.利用Class类的forName方法得到File类
Class<?> aClass = Class.forName("java.io.File");
//2.在控制台打印File类的所有构造器
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor constructor :declaredConstructors){
System.out.println(constructor);
}
//通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class);
Object file = constructor.newInstance("D:\\mynew.txt");
Method createNewFile = aClass.getMethod("createNewFile");
createNewFile.invoke(file);
}
}