-
写出获取Class实例的三种常见方式
类名.Class()
对象名.getClass()
Class.forName(全类名) -
谈谈你对Class类的理解
Class类提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。
- 利用反射和重载完成以下功能
1)创建Student类,类中有属性name和age并封装属性
2)重载Student的构造函数,一个是无参构造并,另一个是带两个参数的有参构造,要求在构造函数打印提示信息
3)创建带main函数的NewInstanceTest类,利用Class类得到Student对象
4)通过上述获取的Class对象分别调用Student有参函数和无参函数
Studen类:
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
NewInstanceTest类:
public class NewInstanceTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class clazz = Class.forName("com.Student");
Object o = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class,int.class);
Object a = constructor.newInstance("zhangsan", 20);
System.out.println(a);
Field f = clazz.getDeclaredField("name");
Field g = clazz.getDeclaredField("age");
f.setAccessible(true);
g.setAccessible(true);
Object o1 = f.get(a);
Object o2 = g.get(a);
System.out.println(o1);
System.out.println(o2);
}
}
- 利用通过反射修改私有成员变量
(1) 定义PrivateTest类,有私有name属性,并且属性值为hellokitty,只提供name的getName的公有方法
(2)创建带有main方法ReflectTest的类,利用Class类得到私有的name属性
(3)修改私有的name属性值,并调用getName()的方法打印name属性值
PrivateTest类:
public class PrivateTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class clazz = Class.forName("com.work.Student");
Field name = clazz.getDeclaredField("name");
System.out.println(name.getName());
Constructor<Student> constructor = clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object o = constructor.newInstance("cat");
Method getName = clazz.getMethod("getName");
Object invoke = getName.invoke(o);
System.out.println(invoke);
}
}
Student类:
public class Student {
private String name = "hellokitty";
private Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
public String toString() {
return "Student{name = " + name + "}";
}
}
- 利用反射和File完成以下功能
(1)利用Class类的forName方法得到File类
(2)在控制台打印File类的所有构造器
(3)通过newInstance的方法创建File对象,并创建D:\mynew.txt文件
FileTest类:
public class FileTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, IOException, InvocationTargetException {
Class clazz = Class.forName("java.io.File");
System.out.println("File 类所有构造器:");
for (Constructor constructor : clazz.getDeclaredConstructors()) {
System.out.println(constructor);
}
Constructor constructor = clazz.getConstructor(String.class);
File myNewFile = (File) constructor.newInstance("D:\\mynew.txt");
System.out.println("创建的文件路径:" + myNewFile.getAbsolutePath());
if (!myNewFile.exists()) {
if (myNewFile.createNewFile()) {
System.out.println("文件创建成功!");
} else {
System.out.println("文件创建失败!");
}
} else {
System.out.println("文件已存在!");
}
}
}