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实例:
- Type.class Class cls1 = String.class;
- getClass() String s = "wensong"; Class cls2 = s.getClass();
- 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();