标签:style blog io 使用 ar java strong for sp
反射机制这几篇博客写下来发现涉及到Java类的加载机制,这部分的内容也比较独立的一部分,因此单另一篇来写。在JAVA中任何的类都是需要加载到JVM中才能运行的。之前Class Loader介绍了类的加载机制,那么这里要说的是不同加载方式之间的对比,好能对JAVA类的实例化过程有更深刻的体会。<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //从当前线程取得正在运行的加载器 ClassLoader cl=Thread.currentThread().getContextClassLoader(); cl.loadClass("com.zjj.ClassTest.Test"); //加载测试类到JVM Class c2=cl.getClass(); //得到类的Class对象 c2.newInstance(); //实例化对象 } }</span></span>这里不用Class.forName来得到Class对象是为了保证类被加载了但是没有被链接。 这段代码看着貌似没什么错,编译也没有问题,但是运行的时候就出错了。也就是说通过如上方法加载的类是没有被链接的,因此newInstance方法无法执行。
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Class c=Class.forName("com.zjj.ClassTest.Test"); c.newInstance(); new Test("ni"); } }</span></span>输出结果为:
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public class Test { static { System.out.println("静态初始化"); } public Test(){ System.out.println("无参数的构造函数"); } public Test(String str){ System.out.println("带参数的构造函数"); } { System.out.println("非静态初始化"); } }</span></span>测试一:客户端调用代码
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Class c=Class.forName("com.zjj.ClassTest.Test"); } }</span></span>输出结果为:静态初始化
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ ClassLoader cl=Thread.currentThread().getContextClassLoader(); Class c=Class.forName("com.zjj.ClassTest.Test", false, cl); } }</span></span>输出结果为:initialize=true时输出,静态初始化。为false时没有输出
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ ClassLoader cl=Thread.currentThread().getContextClassLoader(); Class c=Class.forName("com.zjj.ClassTest.Test", false, cl); c.newInstance(); } }</span></span>输出结果为:
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ Class c=Class.forName("com.zjj.ClassTest.Test"); ClassLoader cl=Thread.currentThread().getContextClassLoader(); Class c=Class.forName("com.zjj.ClassTest.Test", true, cl); } }</span></span>输出结果为:静态初始化
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-family:FangSong_GB2312;">public static void main(String[] arg) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //从当前线程取得正在运行的加载器 ClassLoader cl=Thread.currentThread().getContextClassLoader(); cl.loadClass("com.zjj.ClassTest.Test"); //加载测试类到JVM Class c2=cl.loadClass("com.zjj.ClassTest.Test").getClass(); //得到类的Class对象 c2.newInstance(); //实例化对象 } }</span></span>输出结果:报错
标签:style blog io 使用 ar java strong for sp
原文地址:http://blog.csdn.net/zhuojiajin/article/details/39628339