反射
思考:有没有方法,能在程序运行时去操作一个新建的类?
- 反射可以做到,反射是java的一种操作类的机制,反射就是通过Class实例获取对应class的信息
反射基本框架
Class newclass= Class.forname(className);
//获取类的Class对象(包括类的详细信息)
//注意className必须是全限定名(全称)
Constructor constructor = newclass.getConstructor();
// 通过Class 对象获取构造方法对象(Constructor)
Pay pay = (Pay) constructor.newInstance();
//通过构造方法来创建对象
//Pay是一个接口,这里存在强制类型转换
一、Class类
注意: class 是一个关键字
Class 是一个类,反射里面用到的是这个,里面包含了反射需要的各种方法
1、Class类的获取
所有的类都有一个唯一的与其对应的Class对象
,一共有三种方法
获得Class对象
package reflect;
import reflect.Reflect;
/**
* @className:TestClass;
* @time:2022-05-07-20:03;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException {
//所有的类都有一个唯一的与其对应的Class对象
Reflect ref = new Reflect();
//1、通过Object中的getclass方法类获取Class对象
Class<?> class1 = ref.getClass();
//2、通过Class类中的静态方法forName来获得Class对象
Class class2 = Class.forName("reflect.Reflect");
//3、通过静态的class字段来获得Class类
Class class3 = Reflect.class;
//可以比较下三个Class是否相同
System.out.println(class1 == class2);
System.out.println(class2 == class3);
//测试class静态字段,以及通过String类测试每个类只有一个对应的Class方法
Class class4 = int.class;
Class class5 = String.class;
String ss = new String("this is a test");
//String[] 也是一种类,而且不同于String.class
Class class6 = ss.getClass();
System.out.print("compare String Class: ");
System.out.println(class5 == class6);
}
}
2、动态加载
JVM在执行的时候,并不是一次性把所有的用到的class类加载到内存中,而是第一次用到时才加入进去
public class Main{
public static void main(String[] args){
if (args.length > 0){
create(args[0]);
}
}
public void create(String name){
Person p = new Person(name);
}
}
当执行Main.java的时候,会加载Main.class, 因为用到了Main这个类,如果没有进入if语句,那么就不会加载Person.class,因为没有用到;进入if语句调用create函数才加载Person.class
上述过程就是JVM的动态加载特性