2016-09-22 35 views
0

実行時にクラスを生成するプログラムがあります(変数と関連するgetterメソッドとsetterメソッドのみが含まれています)。後で私はクラスを記入したい。Class.forName()でクラスが見つかりませんが、存在します。

クラスを取得するには - その名前は知っていますが、クラスパスにはありません - 私は.forName()を試しましたが、私は常にClassNotFoundExceptionを取得します。

Exception in thread "main" java.lang.ClassNotFoundException: com.test.wam.business.wsobjects.Testclass 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at gui.Application.main(Application.java:94) 

とコード:ここで

は私の例である

URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    DynamicURLClassLoader dynamicURLClassLoader = new DynamicURLClassLoader(urlClassLoader); 
    dynamicURLClassLoader.addURL(new URL("file://C:\\dev\\Eclipse_was\\guitest\\generated")); 

    Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

    Object classInstance = c.newInstance(); 

クラスローダ:

public class DynamicURLClassLoader extends URLClassLoader { 

public DynamicURLClassLoader(URLClassLoader classLoader) { 
    super(classLoader.getURLs()); 
} 

@Override 
public void addURL(URL url) { 
    super.addURL(url); 
} 

}

ファイルへの完全修飾名( eで作成ザ・クリプス - >)の完全修飾名をコピー

/guitest/generated/com/test/wam/business/wsobjects/Testclass.java

はここに何が間違っているのですか?あなたは次のように代わりにClass.forName(String name, boolean initialize, ClassLoader loader)を使用する必要があなたのクラスをロードするために、特定のClassLoaderを使用したい場合は

+2

"が、そのないクラスパスに"。それ。 –

+1

'Class.forName'には' class'ファイルが必要ですが、 'Testclass.java'はありません。 – passion

+0

私はこの場合どのようにすることができます - 私は生成されたJavaファイルとクラスファイルがありません? – Lasirana

答えて

0

方法Class.forName(String)は、呼び出し側のクラスのClassLoaderを使用しています。

Class c = Class.forName(
    "com.test.wam.business.wsobjects.Testclass", true, dynamicURLClassLoader 
); 

NB:これは動作しますがDynamicURLClassLoaderに提供するURLが有効で、あなたのクラスを持つ親フォルダへのパスです

1

私は2つの問題が表示されます

1)DynamicURLClassLoaderを作成してURLを追加していますが、実際には使用していません。次のステートメント:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

は、現在のクラスをロードしたクラスローダーを使用します。これはおそらくアプリケーションのデフォルトのクラスローダーですが、今作成したばかりのクラスローダーではありません。 javadocは言う:

[Class.forName(className)】指定された文字列名を持つクラスまたはインタフェースに関連付けられたClassオブジェクトが返さ。このメソッドを呼び出すことと等価である:

currentLoaderは現在のクラスの定義クラスローダを示し
Class.forName(className, true, currentLoader) 

だから....解決策は以下のとおりです。

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass", 
         true, dynamicURLClassLoader); 

2)この文字列:URL:

"file://C:\\dev\\Eclipse_was\\guitest\\generated" 

が有効な "ファイル" ではありません。あなたが参照しようとしているパスの正しいURLは次のようになります。

"file:///C:/dev/Eclipse_was/guitest/generated" 

あなたはURL かもしれない作品を書いたが、それはそれを行うには正しい方法ではない方法。

参考:

関連する問題