2016-09-07 8 views
0

からクラスの最初のパッケージ、私はクラスファイルがパッケージが含まれていない場合は、別のディレクトリからクラスファイルからjavaの - 別のディレクトリ

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class"); 
URL[] cp = 
{ 
    new File(file.getParent()).toURI().toURL() 
}; 
URLClassLoader urlcl = new URLClassLoader(cp); 
Class cls = urlcl.loadClass(file.getName().replaceAll("\\.class",""); 

をパッケージ当初どのようにいくつかの問題を抱えている、それが働いています。
それは、パッケージが含まれています、私はこのようないくつかのエラーを取得:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Waktu (wrong name: Name_pack/time/MyClass) 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:367) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

私はパッケージを取得する方法がわかりません。

ので、私はこのような初期たい:あなたが持っているすべては、コードベースでもクラスの予想されるパッケージに関する知識がなくても、絶対ファイルパスである場合

Class cls = urlcl.loadClass(Name_pack.time.MyClass); 

答えて

1

、物事は複雑になります。実際の完全修飾名はクラスファイルに含まれています。そのため、クラスローダーはそれを拒否します。例外メッセージに実際の名前が表示されますが、例外のメッセージにその情報が含まれるという保証はありません。

実際のクラス名を見つけるためにバイトコードを解析したいとは思っていないので、最初にクラスパスディレクトリ(コードベース)と完全修飾クラス名を受け取るようにアプリケーションを再設計することをお勧めします場所。

シンプルですが、実際にはお勧めしません、可能性はそれをしようとしている:

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class"); 
String className=file.getName(); 
if(!className.endsWith(".class")) 
    throw new IllegalArgumentException(file.toString()); 
className=className.substring(0, className.lastIndexOf('.')); 
File codeBase=file; 
Class cls = null; 
do { 
    codeBase=codeBase.getParentFile(); 
    URL[] cp = { codeBase.toURI().toURL() }; 
    URLClassLoader urlcl = new URLClassLoader(cp); 
    try { cls = urlcl.loadClass(className); } 
    catch(NoClassDefFoundError ex) { 
     className=codeBase.getName()+'.'+className; 
    } 
} while(cls==null); 

でも言ったように、最良の選択肢をさせることです、あなたのファイルを提供するものは何でもソース、正しいコードベースディレクトリを提供最初の場所...

関連する問題