分享

JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException

 瞻云轩 2015-05-08
JAVA代码如下:
[java]
package com.test1; 
public class ReferencedCls { 
    private String str = "test value"; 
 
    public String getStr() { 
        return str; 
    } 
    public void setStr(String str) { 
        this.str = str; 
    } 
 
    public ReferencedCls() { 
        System.out.println("Constructor: ReferencedCls"); 
    }    

 
package com.test2; 
import com.test1.ReferencedCls; 
public class StaticReferencingCls { 
    public static void main(String[] args) { 
        System.out.println("Started testing static loading..............."); 
        ReferencedCls cls = new ReferencedCls(); 
        System.out.println(cls.getStr()); 
    } 

package com.test2; 
import com.test1.ReferencedCls; 
public class DynamicReferencingCls { 
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
                System.out.println("Started testing dynamic loading..............."); 
        Class cls = Class.forName("com.test1.ReferencedCls"); 
        ReferencedCls obj = (ReferencedCls)cls.newInstance(); 
        System.out.println(obj.getStr()); 
    } 

以不同的方式运行:
1,在运行环境中能找到需要的类时,都正常运行
[java]
D:\>java -cp d:/temp/t1.jar;d:/temp/t2.jar com.test2.StaticReferencingCls 
Started testing static loading............... 
Constructor: ReferencedCls 
test value 
 
D:\>java -cp d:/temp/t1.jar;d:/temp/t2.jar com.test2.DynamicReferencingCls 
Started testing dynamic loading............... 
Constructor: ReferencedCls 
test value 
2,以静态方式加载,运行环境缺失需要的类,抛出NoClassDefFoundError
[java]
D:\>java -cp d:/temp/t2.jar com.test2.StaticReferencingCls 
Started testing static loading............... 
Exception in thread "main" java.lang.NoClassDefFoundError: com/test1/ReferencedCls 
        at com.test2.StaticReferencingCls.main(StaticReferencingCls.java:9) 
Caused by: java.lang.ClassNotFoundException: com.test1.ReferencedCls 
        at java.net.URLClassLoader$1.run(Unknown Source) 
        at java.security.AccessController.doPrivileged(Native Method) 
        at java.net.URLClassLoader.findClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
        ... 1 more 
3,以动态方式加载,运行环境缺失需要的类,抛出ClassNotFoundException,同时在写代码的时候也需要catch这个异常或者声明这个异常.
[java]
D:\>java -cp d:/temp/t2.jar com.test2.DynamicReferencingCls 
Started testing dynamic loading............... 
Exception in thread "main" java.lang.ClassNotFoundException: com.test1.ReferencedCls 
        at java.net.URLClassLoader$1.run(Unknown Source) 
        at java.security.AccessController.doPrivileged(Native Method) 
        at java.net.URLClassLoader.findClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
        at java.lang.Class.forName0(Native Method) 
        at java.lang.Class.forName(Unknown Source) 
        at com.test2.DynamicReferencingCls.main(DynamicReferencingCls.java:11) 
4,JVM本身使用的方式也是静态加载,如用JAVA命令运行一个带main方法的类,这个类在运行环境缺失.
[java]
D:\>java com.test2.XXXCls 
Exception in thread "main" java.lang.NoClassDefFoundError: com/test2/XXXCls 
Caused by: java.lang.ClassNotFoundException: com.test2.XXXCls 
        at java.net.URLClassLoader$1.run(Unknown Source) 
        at java.security.AccessController.doPrivileged(Native Method) 
        at java.net.URLClassLoader.findClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
Could not find the main class: com.test2.XXXCls.  Program will exit.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多