如果获得一个class 的Class实例?
- Type.class
- getClss()
- Class.forName()
1 Class cls = String.class; 2 3 String s ="Hello"; 4 Class cls = s.getClass; 5 6 Class cls = Class.forName("java.lang.String")
Class实例在JVM中是唯一的
- 可以用==比较两个Class实例
1 Class cls = String.class; 2 3 String s ="Hello"; 4 Class cls = s.getClass; 5 6 Class cls = Class.forName("java.lang.String"); 7 8 9 boolean b1 = cls1 == cls2; //true 10 boolean b2 = cls2 == cls3; //ture
Class实例比较和instanceof的差别
- instanceof不但匹配当前类型,还匹配当前类型的子类
- == 是精准判断类型
1 Integer n = new Integer(123); 2 3 boolean b3 = n instanceof Integer; //true 4 boolean b4 = n instanceof Number; //true 5 6 boolean b1 = n.getClass() ==Integer.class; //true 7 boolean b2 = n.getClss() == Number.Class; //false
注意:在面向抽象编程时,我们不关心具体的子类型,只有在需要逻辑判断时,才进行精准判断。
Reflection
- 反射的目的是:当获得某个Object实例时,我们可以获得该Object的class信息
1 void printObjectInfo(Object obj){ 2 Class cls = obj.getClass(); 3 }
Class
从Class实例获取class信息
- getName()
- getSimpleName()
- getPackage()
1 Class cls = String.class; 2 3 String fname = cls.getName();//"java.lang.String"; 4 String sname = cls.getSimpleName();//"String"; 5 String pkg = cls.gelPackage().getName();//"java.lang";
从Class实例判断class类型:
- isInterface() -- 判断是否为借口
- isEnum() -- 判断是否为枚举
- isArray() -- 判断是否为数组
- isPrimitive() -- 判断是否为基本类型
1 Runnable.class.isInterface(); //true 2 3 java.time.Month.class.isEnum(); //true 4 5 String[].class.isArray(); //true 6 7 int.class.isPrimitive(); //true
创建class实例
- newInstance() --创建一个不带参数的默认方法
1 Class cls = String.class; 2 3 //new String(); 4 5 String s = (String)cls.newInstance();
动态加载
利用JVM动态加载class的特性:
- 可以在运行期根据条件加载不同的实现类
总结:
- JVM为每个加载的class创建对应的Class实例来保存class的所有信息
- 获取一个class对应的Class实例后,既可以获取该class的所有信息
- 通过Class实例获取class信息的方法称为反射(Reflection)
- JVM总是动态加载class,可以运行期根据条件控制加载class
浙公网安备 33010602011771号