.反射
1.获取Class对象:
Class类是用来描述一个类的类, 当程序运行时虚拟机加载.class文件到内存中, 在内存中这些.class文件就是Class类的对象.
我们如果获得了Class对象, 就可以使用这个对象的newInstance()方法来创建该类的实例.
获取Class对象的方式有3种:
a.通过字符串获取: Class.forName(String)
b.通过类名直接获取: 类名.class
c.通过对象获取: 对象.getClass()
2.构造函数Constructor:
如果一个Class对象中有无参构造函数, 那么可以直接使用Class对象的newInstance()方法来创建对象.
但是如果没有无参的构造函数, 那么就需要调用其有参的构造函数来创建对象了.
使用Class类的getConstructor(Class...)方法获取到指定的构造函数.
通过Construtor类的newInstance(Object...)方法来调用构造函数创建对象.
3.方法Method:
我们可以通过Class对象获取一个类中的方法. 获取到方法之后可以运行该方法.
可见的方法:
通过Class类的getMethod(String, Class...)方法获取指定的方法.
通过Method的invoke(Object, Object...)方法调用该方法.
类中定义的方法(包括不可见的):
通过Class类的getDeclaredMethod(String, Class...)方法获取到该类定义的一个方法
如果该方法是一个不可见的方法, 那么需要设置该方法的可见性, setAccessible(boolean)
4.属性Field:
我们可以通过Class对象获取该类中的属性, 可以设置或获取该属性的值.
可见的属性:
通过Class对象的getField(String)方法获取到Field对象
通过Field对象的set(Object, Object)设置该属性的值
类中定义的(包括不可见的):
通过Class对象的getDeclaredField(String)方法获取到Field对象
如果该属性是不可见的, 那么需要设置可见性才能操作. setAccessible(boolean)
/*
* Person 类用来描述人
* Student 类用来描述学生
* String 类用来描述字符串
* Class 类用来描述所有的.class文件
*/
public class ClassDemo {
public static void main(String[] args) throws Exception {
// demo1();
// demo2();
// demo3();
// demo4();
}
private static void demo4() throws ClassNotFoundException {
Apple apple = new Apple();
Class clazz1 = Class.forName("cn.itcast.day29.reflect.Apple");
Class clazz2 = Apple.class;
Class clazz3 = apple.getClass();
System.out.println(clazz1);
System.out.println(clazz2);
System.out.println(clazz3);
System.out.println(clazz1 == clazz2);
System.out.println(clazz2 == clazz3);
// 以上3种方式获取的都是Apple类, 是同一个对象
}
private static void demo3() throws InstantiationException, IllegalAccessException {
//
Object obj = new Apple();
Class<?> clazz = obj.getClass();
//执行完上面两步后,就可以获得一个Class对象
//使用这个Class对象就可以创建Apple对象了
Fruit fruit = (Fruit) clazz.newInstance();
fruit.squeeze();
}
private static void demo2() throws InstantiationException, IllegalAccessException {
Class<?> clazz = Apple.class;
Fruit fruit = (Fruit) clazz.newInstance();
fruit.squeeze();
}
private static void demo1() throws FileNotFoundException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {
BufferedReader br = new BufferedReader(new FileReader("config.txt"));
// 获取到一个Class对象
Class clazz = Class.forName(br.readLine());
// 通过Class对象创建该类的一个实例
Fruit fruit = (Fruit) clazz.newInstance();
// 调用该对象的方法
fruit.squeeze();
}
} |