【java这三个类的区别】Class、ClassValue、ClassLoader

Class的实例代表运行中的类或接口;(java的RTTI就是指Class类提供的功能)
(其中enum是一种类,annotation是一种接口;接口也用类加载器?接口可以单独运行?接口是没有实例的吧?)
(所有类型一样、维度一样的数组共享一个Class;)
(基本类型如int、short、boolean、byte、char、long、double、float,以及void都有Class对象;)
(Class实现了GenericDeclaration、Type、AnnotatedElement等多个接口;并提供了泛型;)
(Class使用了大量反射的API,如Array、Field、Method、Constructor、Modifier、Type及其子类;可见Class是反射和泛型的集大成者;)
(Class没有public的构造函数,它是自动被jvm构造的;)
(Class对final ClassLoader classLoader进行了封装;)
(Class封装了ClassValue.ClassValueMap字段,不清楚什么用?)
(Class有多个native方法,如getSuperclass、isInterface、isArray、isInstance、getModifiers、setSigners、getPrimitiveClass等;)
(注意,用户调用的getDeclaredConstructor、getDeclaredField、getDeclaredMethod、getClasses等最终会调用getDeclaredFields0、getDeclaredMethods0、getDeclaredConstructors0、getDeclaredClasses0等native方法!!!)
(反射没什么神奇的,因为在堆中都保存好了;)
获取Class实例的三种方式为:XXX.getClass()、XXX.class、 Class.forName;
(如new Object().getClass().getName()和Object.class.getName()等价;)
(Integer.TYPE和int.class等价,都是int;以此类推,void.class = Void.TYPE等都成立;)
(getClass和Class.forName都会触发类的初始化,而字面常量.class的方式不会触发初始化;)
https://blog.csdn.net/javazejian/article/details/70768369

ClassLoader是一个抽象类,它的实例负责加载类,可以通过继承来自定义ClassLoader;
(每个ClassLoader有一个父ClassLoader;内置类加载器叫做bootstrap class loader,只有它没有父ClassLoader;)
(jvm从本地文件系统加载class文件,如通过CLASSPATH定义的目录;)
(类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例;每个实例表示一个java类;)
(ClassLoader有多个native方法,如defineClass0、defineClass1、defineClass2、resolveClass0、findBootstrapClass、findBuiltinLib等;)
(实现了静态内部类NativeLibrary,并维护了Vector的systemNativeLibraries和nativeLibraries等;)
(NativeLibrary也有native方法,如load、find、unload;)
jdk中ClassLoader的子类有java.net.URLClassLoader、java.security.SecureClassLoader、ExtClassLoader和AppClassLoader(sun.misc.Launcher)等;
ClassLoader主要的api有findLibrary、loadLibrary、getPackage、definePackage、getClassLoader、getSystemClassLoader、findNative、getSystemResources、getResource、findLoadedClass、findSystemClass、defineClass、findClass、loadClass、resolveClass等;
(什么时候需要自定义ClassLoader?class文件通过网络传输时;实现热部署时;)
类的生命周期为加载、验证、准备、解析、初始化、使用、卸载;(其中前5个属于类加载过程)
类加载器有3种:启动类加载器(即bootstrap classloader,C++实现)、扩展类加载器(即jre1.8.0_152\lib\ext)、应用程序类加载器(即系统类加载器,默认的);
(这三种类加载器依次递进,与自定义类加载器一起构成树状结构;)
(AppClassLoader并不是直接继承自ExtClassLoader的,它们是通过组合的方式来实现父子关系的!!!)
双亲委派模型是指一个类加载器收到类加载请求,会将请求委派给父类加载器完成,直到被传到最顶层的启动类加载器,
当父类加载器无法完成加载请求(它的搜索范围没有找到所需的类),才会交给子类加载器去加载;
(双亲委派模型相当于定义了类加载器的优先级,越往上优先级越高;)
(好处是,某个确定的类总是由同一个类加载器加载,因此可以确保代码中不同位置的这个类加载的是同一个类,如Object类;)
(ClassLoader的loadClass方法就是双亲委派模型!!!)
JVM中两个对象是否为同一个类对象的两个必要条件:

  1. 完整类名必须一致,包括包名
  2. 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同
    https://www.cnblogs.com/fingerboy/p/5456371.html
    https://blog.csdn.net/javazejian/article/details/73413292

ClassValue是jdk1.7提供的抽象类,提供了泛型,为Class类服务,用于存储用户自定义的类信息;(实现并基于静态内部类ClassValueMap、Entry、Version、Identity;)

提问:
类加载会产生死锁?其实也是线程死锁
ClassLoader的loadClass方法利用synchronized (getClassLoadingLock(name))进行了加锁(类加载也是在线程中完成的,和普通操作没区别;)

类初始化也会产生死锁?其实也是线程死锁
https://www.jianshu.com/p/8e8a5a773648

instanceof和isInstance区别?
instanceof是一个关键字,isInstance是Class类的一个native方法;
obj instanceof Animal等价于Animal.class.isInstance(obj);

你可能感兴趣的:(【java这三个类的区别】Class、ClassValue、ClassLoader)