标签:
要讲反射,我们必须要弄清楚Class Object,因为反射提供的方法都是Class Object提供的。
下面是java.lang.Class的类注释:
Instances of the class Class represent classes and interfaces in a running Java application.
An enum is a kind of class and an annotation is a kind of interface.
Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions.
The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects. Class has no public constructor. Instead Class objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the、
defineClass method in the class loader
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/lang/Class.java
java.lang.Class代表的就是运行时加载的所有类型,包括类或者接口的实例。Class对象由Jvm产生(详见 JavaScipt 实现面向对象编程的原理一文,如何控制创建类型一个意思)。下面我们就JVM 如何加载(创建)一个类的过程做个大概的说明:
假设我们运行了 Java path/to/sth.class 这个文件(含main函数), 这时
1. JVM 初始化:
java程序回去找到jvm实现(如windows系统则为jvm.dll),并初始化jvm.
2. Class Load的初始化:
JVM完成初始化后,运行BootStrapLoader(c语言),这个类会先后创建2个Java 版本的Class Loader:ExtClassLoader(Sys Level ext Path) 与AppClassLoader (App Level Path)( 具体过程,我们之后在JVM会陆续道来)。
然后将ExtClassLoader 的Parent设定为自己(BootStrap Loader),把 AppClassLoader的Parent设定为ExtClassLoader,完成ClassLoader的
继承关系。这个继承关系的作用在于,JVM实现的Load Class 方法依照继承关系进行,首先交由Parent Load进行Load,如果找不到Class,才会自己
去找。这样也避免了重复加载的状况。(当然我们有办法让一个Class在相同的JVM被加载2次,但是还没想到用处)
3. 通过Class Loader的机制去Load sth.class。因为BootStrap Load,ExtClassLoader都找不这个类,最后交个AppClassLoader去找找到了,进行Load。
运行。
这里一下各个Class Loader寻找路径:
BootStrap Loader的ClassPath路径为System.getProperty(“sun.boot.class.path”)
ExtClassLoader的Class Path 路径为System.getProperty(“java.ext.dirs”)。
AppClassLoader的ClassPath即为System.getProperty(“java.class.path”)。
我们常常通过Classpath来配置环境变量指定,所以记得加个.在Classpath里面哦。当然也可以通过-cp来覆盖这个path。
所以,如果你Java 运行一个Class 出现ClassNotFoundException的话,就用上面的逻辑缕缕。
标签:
原文地址:http://www.cnblogs.com/velly/p/4741030.html