質問

皆様にお伝えしたくて書き込みは静的解析ツールのための課題も解析Javaバイトコードを使用ASM図書館があります。一部のASMし使用が必要で少なくとも示が必要)と、クラスから読み込みクラスローダ.

えることを期待していたが、ツールの動きを解析.クラスファイルを必要とせずにクラスパス.までの負荷ます。授業から、指定されたディレクトリの実行時に読取InputStream.これはASMことが多いです。あの授業など SimpleVerifier, への負荷の授業になってる。

引っ張り出すだけではなく、これには、こうしたシナリオを登録します。クラスファイルを読み込めるよう呼 Class.forName() までの負荷ですか。があるので簡単に拡張するクラスローダを許可す。


編集:の情報 URLClassLoader した。残念ながら、 Thread.currentThread().setContextClassLoader() へのインスタンスと動作しなかったこのシナリオ。図書館のコード私を呼び出して使用ローダで取得しますインスタンスにトの再計算を用い getClass().getClassLoader().

の時間を設定しますURLClassLoaderのクラスかinitialisedうしないといけないのではないかcontextClassLoaderはないというものである。

いを理解する応答を確認してください。◆を使っても、URLClassLoaderの第3者プログラミング未経験者可能性?

役に立ちましたか?

解決

どまった。

場合は授業をめどこかで読み込むことができている URLClassLoader.でき後、このClassLoaderに、ClassLoader、現在のスレッド: Thread.setContextClassLoader(ClassLoader)

ユーザーが取得し、現在のスレッドのコンテキストクラスローダを使用するアクセスし、クラス定義で設定します。

他のヒント

まず、ASM はクラスに関する情報を取得するために ClassLoader を使用しない方法で使用できます。

ASM フレームワークにはデフォルトでクラスをロードする場所がいくつかありますが、それらの場所はすべて独自のサブクラスでオーバーライドできます。私の頭のてっぺんから:

  • ClassWriter.getCommonSuperClass() このメソッドは、ClassWriter.COMPUTE_FRAMES フラグが使用されている場合にのみ呼び出され、クラスに関する情報を取得するために ClassLoader を使用しないように上書きできます。その例は次のとおりです。 ClassWriterComputeFramesTest ClassInfo 抽象化を導入します
  • 同様に、SimpleVerifier.getClass() メソッドは次のように使用されます。 SimpleVerifier.isAssignableFrom() 後者を上書きし、ClassInfo 抽象化を使用して共通のスーパー タイプを見つけることができます。私の記憶が間違っていなければ、AspectWerkz プロジェクトも型パターン マッチング コードに同様の機能を実装していました。があることにも注意してください SimpleVerifier.setClassLoader() メソッド。独自のクラスをロードしたい場合に使用できます。

余談ですが、Sun の JVM では、ロードされたクラスは PermGen 領域に到達し、アンロードできません。そのため、静的コード分析の目的でのみクラスをロードすることはお勧めできません。それを回避できる場合、特にツールがIDE などの長期間存続するプロセスに統合されます。

あなたは、私の知る限りでは、実行時にシステムのクラスローダを拡張することはできませんが、動的に<のhref = "HTTPを使用して任意の場所(JARまたはディレクトリ)からクラスをロードすることができます//java.sunを.COM / J2SE / 1.4.2 /ドキュメント/ API / Javaの/ネット/ URLClassLoader.html」のrel = "nofollowをnoreferrer"> URLClassLoaderのを。

あなたはセットアップにそれをクラスパス上の位置と、独自のURLClassLoaderの場所を渡す.classを作成し、そのクラスローダからアプリケーションを起動し、アプリケーションの起動中に「ランチャー」を試すことができます。

SimpleVerifierURLClassLoaderによってロードされると、

また、余分な場所からクラスをロードすることができるようになります。

はい、あなたが使用することができますのURLClassLoader

私は、実行時にクラスをロードしないテストを持っています。このクラスは、(テストはそのことについては実行されたときにも存在さえして)、後でそれがロードされたクラスパスにありませんし、素晴らしい作品。

ここでは、コードです。

void testHello() throws MalformedURLException, ClassNotFoundException {
    URL[] url = {
            new URL("file:/home/oreyes/testwork/")
    };

    try {
        new URLClassLoader(url).loadClass("Hello");
        throw new AssertionError("Should've thrown ClassNotFoundException");
    } catch ( ClassNotFoundException cnfe ){}


    c.process();// create the .class file 

    new URLClassLoader(url).loadClass("Hello");

    // it works!!
}

この質問するから撮影。

私はその非常に簡単に私自身のClassLoaderを作成します。

 /**
 * Used to hold the bytecode for the class to be loaded.
 */
private final static ThreadLocal<byte[]> BYTE_CODE = new ThreadLocal<byte[]>();

@Override
protected Class<?> findClass(final String name) throws ClassNotFoundException {
    final byte[] bytes = BYTE_CODE.get();
    if (null == bytes) {
        throw new ClassNotFoundException(name);
    }
    return this.defineClass(null, bytes, 0, bytes.length);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top