2011-07-14 11 views
0

私はリフレクションを使用してJava用の逆コンパイラを作成しようとしています(渡されたjarファイルのメソッドシグネチャ情報が必要です)。 URLClassLoaderを使用してjarファイルからクラスをロードし、そのクラスをデコンパイラに渡します。すでにJavaの別の場所からロードされているときにリフレクション用のクラスをロードする

しかし、私は問題に遭遇しました。私が読もうとしているjarには、すでに自分の環境にロードされているクラスの異なるバージョンが含まれています。だから私が電話するとき

ClassLoader myClassLoader = URLClassLoader.newInstance(jars, null); 
Class<?> classToDecompile = Class.forName(className, false, myClassLoader); 

それは私のjarファイルからクラスを返しませんが、既にロードされている。リフレクションのためだけにクラス情報をロードし、JREからではなく渡されたjarからクラス情報を取得する方法はありますか?

編集:

私がコンパイルしようとしているjarファイルがスローされるセキュリティ例外が発生しjava.langパッケージにクラスが含まれています:

java.lang.SecurityException:禁止パッケージ名:れるjava.lang

+0

スタックトレースとは何ですか? – Ladlestein

+0

さて、私の現在のJREとは違うjava。*のものについてはあまり気にしないので、それをフィルタリングするだけです。 –

答えて

3

ClassLoader.loadClass(文字列、ブール値) - 次いで、以前にロードされたクラスの最初のチェック、及び、任意のが見つからない、 - URLClassLoaderのが継承親クラスローダをチェックします。このメソッドをオーバーライドして、以前にロードされたクラスのチェックをバイパスすることができます。親をバイパスする必要があるかどうかはわかりません。

これは邪悪なクラスローダです。おそらくそれを他のものに使うべきではありません。

また、クラスファイルの内容(バイトコード)を取得し、ClassLoader.defineClass(name、byte []、int、int)を自分自身で呼び出すこともできます。クラス。私はこれがより良いアイデアだと思います。

0

JADがあると時間が無駄になるのはなぜですか?それでも達成したい場合は、child-first戦略で独自のクラスローダーを作成する必要があります。

関連する問題