一、写出获取Class实例的三种常见方式
1). 利用对象调用getClass()方法获取该对象的Class实例
2). 使用Class的静态方法forName(),用类的名字获取一个Class实例
3). 运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例。
二、谈谈你对Class类的理解
Class
类是Java反射机制中的核心,它代表了运行时的类类型。通过Class
类,我们可以获取类的信息,如属性、方法和构造函数等,并且可以在运行时动态地加载类、创建对象和调用方法。
三、利用反射和重载完成以下功能
1)创建Student类,类中有属性name和age并封装属性
2)重载Student的构造函数,一个是无参构造并,另一个是带两个参数的有参构造,要求在构造函数打印提示信息
3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象
4)通过上述获取的Class对象分别调用Student有参函数和无参函数
Student类:
public class Student {
private String name;
private int age;
public Student() {
System.out.println("无参构造");
}
public Student(int age) {
this.age = age;
}
protected Student(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类:
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("reFlectDemo.Student");
Constructor constructor = clazz.getConstructor();
Student obj = (Student) constructor.newInstance();
Constructor constructor1 = clazz.getDeclaredConstructor(String.class, int.class);
Student obj1 = (Student) constructor1.newInstance("张瑾轩", 23);
System.out.println(obj);
System.out.println(obj1);
}
}
四、利用通过反射修改私有成员变量
1. 定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法
2. 创建带有main方法ReflectTest的类,利用Class类得到私有的name属性
3. 修改私有的name属性值,并调用getName()的方法打印name属性值
PrivateTest类:
public class PrivateTest {
private String name="hellokitty";
public String getName() {
return name;
}
}
测试类:
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("ReflectTest1.PrivateTest");
Field name = clazz.getDeclaredField("name");
Object obj = clazz.newInstance();
name.setAccessible(true);
name.set(obj,"zjx");
Method getName = clazz.getDeclaredMethod("getName");
System.out.println(getName.invoke(obj));
}
}
五、 利用反射和File完成以下功能
1. 利用Class类的forName方法得到File类
2. 在控制台打印File类的所有构造器
3. 通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
测试类:
public class ClassNotFoundException {
public static void main(String[] args) throws Exception {
// 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);
}
}