問題タブ [dynamic-class-loaders]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - コード内でコンパイルしますが、希望する動作が得られません。
だから私はいくつかのコードを持っています-文字列'temp'をコンパイルしてから実行し、次に文字列を変更して再コンパイルして実行したいと思います。問題は、現在、コードの最初のビットを最初に実行しているだけであるということです。
私が期待する:
そして私は得る:
完全なコードが続きます、どんな助けでもありがたいです。
java-compiler-api - JavaコンパイラAPIを使用して複数のJavaファイルをコンパイルする
こんにちは私はJavaクラスの実行時に作成、コンパイル、ロードする必要があります。FTLを使用して、Javaソースファイルを作成しています。動的な依存関係がない場合は、ソースをコンパイルできます。
インスタンスを詳しく説明するために、2つのJavaソースファイル、1つのインターフェイスとその実装クラスがあります。次のようにJavaコンパイラAPIを使用してインターフェイスをコンパイルできます
すでにクラスパスにある静的クラスのクラスパスを設定しましたが、このアプローチは動的に作成されたクラスでは機能しませんか?カスタムクラスローダーで修正できますか?私の最終的な実装はウェブ/アプリサーバーになります
フィードバックは大歓迎です
Satheesh
java - パッケージを指定せずにフォルダーからクラスをロードする
抽象クラスを使用して、人々が独自の実装を作成できるようにするアプリケーションがあります。これらの実装をディレクトリから .class-files としてロードします。現在、私はこの解決策を持っています:
ご覧のとおり、クラスを正しくロードするには、クラスが配置されているパッケージを指定する必要があります。パッケージを省略すると、
エラー。
さて、アーキテクチャの視点から、他の人が設計したクラスをロードするときに MY パッケージにコンパイルする必要があるのは、非常に不適切な設計だと思います。
だから私はあなたに尋ねます:クラスが存在するパッケージを指定せずに、ファイルシステムからクラスをロードできる方法はありますか?
java - 実行時にjarファイルからインターフェースを実装するクラスをロードする方法は?
ユーザーが実装したクラスを使用できるアプリケーションを実装したいと思います。各クラスは、私がインターフェースを定義するインターフェースを実装する必要があり、最後に、ユーザーによって実装されたすべてのクラスがjarファイルにアーカイブされます。ユーザーはjarファイルをクラスパスにコピーしてから、アプリケーションにjarファイル名のみを指定します。私のアプリケーションは、jarファイルを動的にロードできるはずです。これを行うには、この投稿が非常に便利であることがわかりましたが、クラス名でクラスをロードします。親に基づいてクラスをロードしたい。
ロードされたjarファイルにA
とB
クラスの両方があるとします。インターフェイス名B
を知ってクラスからインスタンスを取得したい。iB
私は何をすべきか?
java - クラスローダーがリリースされたときにシングルトンでファイナライズが呼び出されるのはいつですか?
「リリースされた」とは、クラスローダーへの参照が残っていないことを意味します。
頻繁に再デプロイされる Java EE アプリケーションが permgen スペースを消費するという問題が発生しています。分析の結果、Java EE アプリのシングルトンがアプリケーションの外部のアプリケーション クラスローダー オブジェクトへの参照を渡し (Java EE 規則に違反して)、アプリのアンデプロイ時にそれらをクリアしていないことがわかりました。
シングルトンまたはクラス オブジェクトへの参照が他に残っていないと仮定すると、そのクラスのクラスローダーが解放されたときにシングルトンの finalize() が呼び出されますか? そこの不正なインバウンド参照をクリアしたいと思います。または、クラスローダー自体がガベージコレクションされるまでファイナライズが呼び出されないcatch-22にいますか?したがって、不正な外部参照のために呼び出されることはありませんか?
ここでの主な質問はおそらく次のとおりです。
この場合、クラスローダーがまだガベージコレクションできない場合、クラスオブジェクトはガベージコレクションされますか? これは、クラスローダの動作の仕様に依存するか、実装に依存する可能性があります。
参照 (別の種類! ;-)) は歓迎されますが、必須ではありません。
java - JUnitCore がテスト ケースで必要なライブラリをロードしない
外部クラスのテストを動的に実行するメソッドを作成しようとしています。JDK ライブラリのみを使用するテストを実行できますが、org.jmock.Mockery などの別のライブラリを使用するテストを実行すると、JUnitCore.run(args) によって返される結果オブジェクトに次のエラーが発生します。
言うまでもなく、Eclipse で元のプロジェクトからテストを実行すると、テストが実行されて合格します。
ClassLoader はテスト対象のクラスのみをロードしているように見え、外部プロジェクトのクラスパスで定義された依存関係 (jar など) をロードしていないように見えるため、この問題はクラスパスに関連していると思います。実行中のアプリケーションに jar を動的にロードする方法がわかりません。
以下は、クラスをロードしてテストを実行するコードです。
前もって感謝します、
マーク・カチア
java - カスタム システム クラス ローダーがすべてのクラスで使用されているわけではありません
JVM の複数のインスタンス間で (ネットワーク経由で) 動的に生成された型 (Kryo でシリアル化されたバイナリ表現) を渡す必要がある機能を実装しています。ロードされているタイプとロードされていないタイプを適切に解決するために、カスタム システム クラス ローダー (Java-Djava.system.class.loader
パラメータとして渡される) を使用します。これは、動的に作成された他のクラス ローダーによって親として使用されます。このカスタム システム クラス ローダーはその子を認識しており、クラスが見つからない場合は、これらの派生クラス ローダーにそれがあるかどうかを問い合わせることができます (これは、クラス ローダーの標準的な階層構造とは逆です)。
これらの動的に生成された型は、異なる JVM 間で完全に正常に転送およびロードされます。動的に生成された型の 1 つを参照する何らかの型 (対応するクラスはディスクからロードされ、すべての JMV で同一です) のインスタンスを逆シリアル化しようとすると、問題が発生します。readClass
動的に生成された型の名前によって。
メソッド内readClass
に への呼び出しがありますClass.forName
。これは、指定されたカスタム クラス ローダー (動的に生成されたすべての型を認識している) を使用せず、代わりに sun.misc.Launcher$AppClassLoader インスタンスを使用します。
説明されている問題を回避するために、すべてのクラスがロードされるように、システム全体のカスタム クラス ローダーを指定することは可能ですか?
アップデート
詳細な分析によりClassLoader.getSystemClassLoader()
、指定されたカスタム システム クラス ローダーを実際に返すことが明らかになりました。幸いなことに、Kryo ライブラリは、特にデシリアライズ時にクラスをロードするためのカスタム クラス ローダーの設定をサポートしています。これら 2 つの事実は、説明した問題に対する解決策の基礎を形成しました。
java - クラス名のみを使用してクラスをロードする方法
クラスの1つをロードするには、JavaのClass.forName( "")を使用する必要があります。問題は、完全修飾クラス名ではなく、クラス名のみを指定してクラスをロードする必要があることです。
たとえば、これは機能しますが、私の要件に適合しません。
Class.forName( "reflection.Person");
そして、これは私が必要としているものですが、機能していません:
Class.forName( "Person");
誰もが#2を機能させる方法を知っていますか?単純なクラス名を使用する必要があります。クラスが存在するかどうかを確認するためにフォルダ構造をウォークスルーするサードパーティツールはありますか?これは実行可能なJARとしてデプロイされます。
前もって感謝します。
java - 動的クラスの再読み込みはデバッグ モードでのみ機能しますが、なぜ/どのように実際に機能するのでしょうか?
難しい質問があります。
私のJavaプログラムはループで次のようなことをしています:
ループ:
コンパイルされた Java クラスを含む外部ファイルを byte[] 配列に読み込みます。
自分のクラスローダーの新しいインスタンスを作成します。
読み込まれたファイルからクラスローダーのこのインスタンスへの setbytes。
作成されたクラスローダーを使用して、外部ファイルからクラスのオブジェクトの新しいインスタンスを作成します。
作成されたオブジェクトの任意のメソッドを呼び出します。
そして、問題はどこにありますか。
このプログラムをデバッグモードで実行すると、期待どおりに動作するため、外部ファイルが変更された場合、クラスローダーは新しいバージョンのクラスをロードして新しいバージョンを実行します (ファイルが変更されていない場合は、もちろん古いバージョンもロードします)。
しかし、このプログラムをデバッグモードで実行しないと、読み取ったファイルが変更されているにもかかわらず、常に古いバージョンが実行されます。
クラスローディングの問題と JVM の動作についてより深い知識を持っている人が、この動作を説明してくれるかもしれません。
java - JSP用のTomcatクラスのリロード
JSPのリロードに関してTomcatでクラスのリロードはどのように機能しますか(内部アーキテクチャについて話しています)?
各JSPがJavaクラスにコンパイルされていることを私は知っています。しかし、クラスローダーがクラスのアンロードを許可せず、ガベージをあまり収集しない場合、クラスローダー(Webアプリケーションごとに一意)はこれらの生成されたクラスをどのようにリロードしますか?