一、写出获取Class实例的三种常见方式
答:①Class<类名> c=类名.class;
②首先创建一个类的对象,然后通过对象名.getClass()方法实例化(Class<?extends 类名> > c=对象名.getClass())
③Class<?>c=Class.forName("包名.类名");
二、反射获取File类,并调用其中带参方法创建对象,调用其中方法创建一个文件
1. 利用Class类的forName方法得到File类
2. 在控制台打印File类的所有构造器
3. 通过newInstance的方法创建File对象,并创建E:\\DELL\\后端关卡8-16\\关卡15_反射思想\\01_反射\\课后练习\\mynew.txt文件
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class T_2_2 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<?> cs = Class.forName("java.io.File");
Constructor<?>[] dcl = cs.getDeclaredConstructors();
for (Constructor c:dcl) {
System.out.println(c);
}
Constructor<?> decl = cs.getDeclaredConstructor(String.class);
Object o = decl.newInstance("E:\\DELL\\后端关卡8-16\\关卡15_反射思想\\01_反射\\课后练习\\mynew.txt");
//File file = new File();
//file.createNewFile()
Method dc = cs.getDeclaredMethod("createNewFile");
dc.invoke(o);
}
}
三、利用反射修改Class类中的私有属性值
以一个学生类为例
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> cs = Class.forName("Reflect.PrivateTest");
Constructor<?> con = cs.getConstructor();
Object o = con.newInstance();
System.out.println("修改前默认值");
System.out.println(o);
System.out.println("-----------");
Field name = cs.getDeclaredField("name");
name.setAccessible(true);
name.set(o,"张三你好!");
Method getName = cs.getMethod("getName");
System.out.println("修改值后getName方法打印出结果");
System.out.println(getName.invoke(o));
}
}
实践运行结果: