反射的实质:
就是在得到Class对象之后,反向获取Class对象的对象。
解读:Class的对象好比一个类,反向获取Class对象(也就是类)的对象。
其中类字面常量反射,通过把xxx.class字节码文件反射回去生成编译前的类。
不清楚Class类的可以点击查看本人另一篇博文:Class与class的区别
对Class类解读:
我们通常认为类是对象的抽象和集合,Class就相当于是对类的抽象和集合。
也可以认为对象是类的实例,类是Class的实例。
运用反射机制:
在获得Class对象后我们可以调用:
Class对象.getDeclaredConstructor().newInstance()
方法去获取Class对象的对象
例子:
package Task;
import org.junit.Test;
public class Try0 {
@Test
public void toTry() throws Exception {
//forName方法:参数为其类的路径
Class a = Class.forName("Task.Try1");
System.out.println(a);
//通过对象得到类
Try1 try1 = new Try1();
Class b = try1.getClass();
System.out.println(b);
//类字面常量,通过把xxx.class字节码文件反射回去生成编译前的类
Class c = Try1.class;
System.out.println(c);
//JAVA9之后废弃newInstance()方法
//反射机制,用Class的对象a(Try1类型) 生成了Try1的对象try2,并且调用了try2的toPrint方法。
Try1 try2 = (Try1) a.getDeclaredConstructor().newInstance();
System.out.println(try2+try2.toPrint());
//反射机制,用Class的对象b(Try1类型) 生成了Try1的对象try3,并且调用了try3的toPrint方法。
Try1 try3 = (Try1) b.getDeclaredConstructor().newInstance();
System.out.println(try3+try3.toPrint());
//反射机制,用Class的对象c(Try1类型) 生成了Try1的对象try4,并且调用了try4的toPrint方法。
Try1 try4 = (Try1) c.getDeclaredConstructor().newInstance();
System.out.println(try4+try4.toPrint());
}
}
class Try1 {
public String toPrint(){
return "调用了toPrint";
}
}
输出结果:
可以看到生成了不同的Try1对象,和new出来的对象一样,可以使用对象的方法等等。