Java反射与泛型1

Class

基本数据类型:https://blog.csdn.net/weixin_40959890/article/details/106500768

Java除了基本类型以外其他都是class(包括interface)

  • String                   String s = "wensong";
  • Object                  Object o = new Double(110.120);
  • Runnable             Runnable r = new Thread();
  • Exception             Exception e = new RunimeException();
  • ...

class(包括interface)的本质就是数据类型(Type)  :Double d = new Double(123.119);

class/interface 的数据类型是Class(C大写),每加载一个class,JVM就会为其创建一个Class实例,并关联起来,如String:

                                                         

Class实例是JVM内部创建的,我们无法自己创建Class实例

//JDk内源码
public final class Class{
    private Class(){}
}

JVM持有的每个Class实例都指向一个数据类型(Class或interface)

          

一个Class实例包含了该class的完整信息

         

通过Class实例获取class信息的方法成为反射(Reflection)

如何获取一个class的Class实例:

  1. Type.class      Class cls1 = String.class;
  2. getClass()       String s = "wensong"; Class cls2 = s.getClass();  
  3. Class.forName()     Class cls3 = Class.forName("java.lang.String");  //括号里是完整的类名

Class实例在JVM中是唯一的,可以用 == 比较两个Class实例,如上面的cls1、cls2、cls3

boolean b1 = cls1 == cls2;//true
boolean b2 = cls2 == cls3;//true

Class实例与instanceof的差别:

Class实例只能精确比较两个实例,instanceof可以比较当前实例的子类,比如Integer是number的子类

Integer n = new Integer(110);

boolean b3 = n instanceof Integer; // true
boolean b4 = n instanceof Number; // true

boolean b1 = n.getClass() == Integer.class; // true
boolean b2 = n.getClass() == Number.class; //false

反射Reflaction

反射的目的是当获得某个Object实例时,我们可以获取该Object的class信息

  • getName()
  • getSimpleName()
  • getPackage()
Class cls = String.class;
String fname = cls.getName();// "java.lang.String";
String sname = cls.getSimpleName(); //"String";
String pkg = cls.getPackage().getName(); //"java.lang";

从Class实例判断class类型:

  • 实例 isInterfacs( )         Runnable.class.isInterface(); //true
  • 枚举 isEnum()               java.time.Month.class.isEnum();//true
  • 数组 isArray()                String[].class.isArray();//true
  • 基本类型 isPrimitive()   int.class.isPrimitive();//true    虽然基本类型变量本身不是class,但是JVM内部会创建相应的int.Class 等基本类型对应的Class实例

利用JVM动态加载class的特性,可以在运行期间根据条件加载不同的实现类:如Commons Logging优先使用Log4j,如果Log4j不存在就使用JDK的Logging,判断一个类是否存在我们只需要用Class.forName(完整类名),如果存在就返回true,如果不存在就捕获异常返回false就可以了

boolean isClassPresent(String name){
    try{
        Class.forName(name);
        return true;
    }catch(Exception e){
        return false;
    }
}


//Commons Logging 优先使用Log4j:
LogFactory factory;
if(isClassPresent("org.apache.logging.log4j.Logger"){
    factory = createLog4j();
}else{
    factory = createJDKLog();
}

 小例子:新建Student对象

Class cls = Student.class;
//Student s = new Student();
Student s = (Student) cls.newInstance();

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值