如果获得一个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

 

posted on 2020-12-21 15:31  无聊人,生代码  阅读(142)  评论(0)    收藏  举报