当使用Java命令运行某个程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序多么复杂,该程序启动了多少线程,它们都处于该Java虚拟机进程里。同一个JVM的所有线程,所有变量都处于同一个进程里,他们都使用该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止:
类加载指的是将类的class文件读入内存,并为之创建一个Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个Class对象。
当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过以下3个步骤来对类进行初始化。
JVM初始化一个类包含以下步骤:
JVM最先初始化的总是Object类。
当JVM启动时,会形成由3个类加载器组成的初始类加载器层次结构:
Bootstrap加载器被称为引导类加载器,它负责加载Java的核心类。
package com.ivy.reflection; import java.net.URL; public class BootstrapDemo { public static void main(String[] args) { // TODO Auto-generated method stub URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); for(int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); } } }
输出结果:
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/resources.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/rt.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/sunrsasign.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/jsse.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/jce.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/charsets.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/lib/jfr.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.7.0_45/jre/classes
Extension负责加载JRE的扩展目录(%JAVA_HOME%/jre/lib/ext或者由java.ext.dirs系统属性指定的目录)中JAR包中的类。
System类加载器负责在JVM启动时加载来自java命令的-classpath选项/java.class.path系统属性,或CLASSPATH环境变量所指的JAR包和类路径。
URLClassLoader是ClassLoader的一个实现类,它既可以从本地文件系统获取二进制文件来加载类,也可以从远程主机获取二进制文件来加载类。
获得Class对象的3种方式:
大部分时间使用第二种方式。
package com.ivy.reflection; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @SuppressWarnings(value="unchecked") @Deprecated public class ClassDemo { private ClassDemo() { } public ClassDemo(String name) { System.out.println("constructor with param"); } public void info() { System.out.println("method info without param"); } public void info(String str) { System.out.println("method info with a param"); } class Inner { } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Class<ClassDemo> clazz = ClassDemo.class; Constructor[] ctors = clazz.getDeclaredConstructors(); System.out.println("all constructors of ClassDemo : "); for (Constructor c : ctors) { System.out.println(c); } Constructor[] publicCtors = clazz.getConstructors(); System.out.println("all public constructors of ClassDemo : "); for (Constructor c : publicCtors) { System.out.println(c); } Method[] mtds = clazz.getMethods(); System.out.println("all public methods of ClassDemo : "); for (Method m : mtds) { System.out.println(m); } System.out.println("info method with a param in ClassDemo : " + clazz.getMethod("info", String.class)); Annotation[] anns = clazz.getAnnotations(); System.out.println("all annotations in ClassDemo : "); for (Annotation an : anns) { System.out.println(an); } System.out.println("@SuppressWarning comment in ClassDemo : " + clazz.getAnnotation(SuppressWarnings.class)); Class<?>[] inners = clazz.getDeclaredClasses(); System.out.println("all inner classes in ClassDemo : "); for (Class c : inners) { System.out.println(c); } Class inClazz = Class.forName("com.ivy.reflection.ClassDemo$Inner"); System.out.println("inClazz outer class : " + inClazz.getDeclaringClass()); System.out.println("ClassDemo package : " + clazz.getPackage()); System.out.println("ClassDemo parent class : " + clazz.getSuperclass()); } }
通过反射来生成对象有两种方式:
原文:http://www.cnblogs.com/IvySue/p/6434684.html