問題タブ [javassist]
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.
osgi - クラスパスにtools.jarをすでに追加しましたが、なぜまだjava.lang.NoClassDefFoundError:com.sun.jdi.Bootstrapがスローされるのですか?
javassistのHotSwap関数を使用していますが、クラスパスにtools.jarが必要なので-cp tools.jar
、OSGiアプリケーションを起動するときに追加しました。しかし、私new HotSwap()
がバンドルの1つのコードにいるとき、
投げられました。com.sun.jdi.Bootstrap
はtools.jarにあり、クラスパスにすでに追加しています。また、機能しない場合は次のコードが機能しないため、機能することを確認しました。
HotSwapperのクラスローダーはクラスをロードできませんcom.sun.jdi.Bootstrap
か?それでは、なぜそれが私のEclipse環境で正しく機能するのですか?(ビルドパスのライブラリにtools.jarを追加しました)
NoClassDefFoundErrorの理由については、手がかりをいただければ幸いです。
java - javaassistを使用して.classファイルを作成するときに@Overrideアノテーションをメソッドに追加する方法は?
@Override
javaassistを使用してクラスを作成しているときに、メソッドにアノテーションを追加するにはどうすればよいですか?
このコードは次のように例外をスローしています。
osgi - javaassist を使用して生成されたクラス ファイルでサービスを使用する方法
javaassistを使用して生成されたクラスファイルでサービスを使用できますか? どうすればそれを達成できますか?? このクラスは動的に作成されるため、このクラスが別のクラスの提供されたサービスを使用していることを登録するにはどうすればよいですか?
java - Javassist のキャストと連結の問題
文字列として渡された関数をインスタンス化する必要があり、定義後に関数を実行できるようにする「関数」オブジェクトのラッパーを作成しました。
ラッパーは JavaAssist ライブラリを使用し、オブジェクトとメソッドをラッパー オブジェクトのフィールドとして使用し、メソッドを使用してラッパー クラスの外部で関数を使用できるようにします。
私の問題は、関数本体の構文に関するものです。たくさんあります
java.lang.VerifyError: (class: MyClass, method: myMethod signature: (*my signature, unimportant *) Expecting to find *a primitive type* on stack
たとえば、その場でのキャストに関連する
私が解決したもの(本当に良い解決策ではありませんが、機能しています)これらのキャストを回避し、定義された型の変数を常にインスタンス化します
今、私は別の問題を抱えており、それは私を夢中にさせています:これは文字列の内容です
t2.getClass() と t3.getClass() は java.lang.Double を返しますが、mysum は t2 と t3 の連結であり、算術合計ではありません...どうして可能なのでしょうか?
java - classLoader を使用して動的にクラスをロードする方法
ディスクに .class ファイルがあります。javaassistを使用してjvmに動的にロードしたい。しかし、それは例外をスローします。以下は私が書いたコードです:
D: ドライブに .class ファイルがあり、evn で次の例外がスローされます。
ディスク上の.classファイルをjvmに動的にロードして実行する方法???
java - 実行時に一部のメソッドの内容を置き換える
実行時に一部のメソッドの内容を置き換えたいと考えています。
これにはjavassistを使用できることはわかっていますが、拡張したいクラスがシステムclassLoaderによってすでにロードされているため、機能しません。
実行時にメソッドの内容を置き換えるにはどうすればよいですか? クラスをアンロードする必要がありますか? どうやってやるの ?可能であることがわかりましたが、それを行う方法がわかりませんでした。
可能であれば、これに外部ライブラリを使用することは避けたいと思います。自分でコーディングしたいと思います。
詳細情報: - 拡張したいクラスがフレームワーク (jar ファイル) に含まれている - 私のコードは実際にはこのフレームワークのプラグインです - 私のプラグインが実行されるフレームワークには独自のclassLoaderがありますが、このclassLoaderはありません独自のクラスをロードします (システム クラス ローダーに委譲します) - 私が使用しているフレームワークはPlayです。
ご協力ありがとうございました !
reflection - javassist で注釈を追加すると、以前のコードが削除されます
ロード中にいくつかの注釈をクラスに追加しようとしています。
そのために、ロード時にクラスバイトコードを取得して変更できるJavaエージェントトランスフォーマーを作成しました。次のコードを実行すると、クラスに新しい注釈が表示されますが、以前の注釈とフィールド/メソッドはすべて削除されます。
classFileBuffer は、クラスローダーに返されるバイト配列です。以前のクラスの注釈とコードが削除された理由を知っている人がいれば、非常に役に立ちます。
ありがとう、
アヴナー
java - Java クラスへのフィールドの追加
CGLib、ASM、BCEL (アスペクト)、および Javassist を使用して、実行時にクラスにフィールドを追加することを検討しました....
頭を整理すると、これらのバイトコード操作者は実際のクラスを更新せず、ユーザーが変更をダンプすることしかできないようです (CGLib や writeFile メソッドの場合と同様)。(a)(BCELでInputStreamを実行するのではなく)クラスをロードし、(b)クラスを更新するソリューションを見つけることを望んでいました。
多分これは正常ですか?人々は通常、プロキシを作成し、プロキシを渡しますか?
私がやりたいことは、特定の注釈を持つフィールド (プロパティではない) を探すフレームワークにオブジェクトを渡す前に、フィールド (注: get/set メソッドによるプロパティではない) を追加することです。したがって、「クライアント」は、追加のフィールドを挿入したいターゲット クラスを作成しています。これらのオブジェクトを操作したいサービス層への AOP 呼び出しをインターセプトします。
assert - Javassist: 「assert」ステートメントを生成する
メソッドに「assert」ステートメントを追加しようとしています。
しかし、私はこの例外を受け取ります:
原因: コンパイル エラー: javassist.compiler の javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:716) の mypackage.MyClassThatIsInstrumented に assert(boolean) が見つかりません.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156) で javassist.compiler.ast.CallExpr.accept(CallExpr.java:45) で javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:241) で javassist.compiler.CodeGen. atStmnt(CodeGen.java:329) at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49) javassist.compiler.CodeGen.atStmnt(CodeGen.java:350) at javassist.compiler.ast.Stmnt.accept (Stmnt.java:49) javassist.compiler.CodeGen.atMethodBody(CodeGen.java:291) で javassist.compiler.Javac.compileBody(Javac.java:222) で javassist.CtBehavior.setBody(CtBehavior.java:360) ... 30以上
それを解決する方法はありますか?
java - Javassistの定数プールを理解する
Javassistを使用して、実行時に特定のクラスを拡張しています。ConstPool
いくつかの場所(生成コード内)で、Javassistクラスのインスタンスを作成する必要があります。たとえば、生成されたクラスをとしてマークするためにsynthetic
、次のように記述しました。
これは期待どおりに機能していますが、これが完全に正しいかどうかについては疑問があります。具体的には、私の主な質問は次のとおりです。
CtClass.getClassFile().getConstPool()
この例では、定数プールを取得する正しい方法を呼び出していますか?そうでない場合、Javassistを使用して実行時に新しいクラスを作成するときに、定数プールの適切なインスタンスを取得するための一般的な適切な方法は何ですか?
また、ここでカーテンの後ろで何が起こっているのかについて少し迷っています:合成属性のインスタンス、または一般に他の種類のクラス属性のインスタンスを作成するために定数プールが必要なのはなぜですか?
ご説明いただきありがとうございます。