問題タブ [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.
java - Javassistで抽象クラスを非抽象にする方法は?
私が構築している小さなフレームワークで、Javassist を使用して特定の抽象クラスを非抽象クラスに変更したいと考えています。必要な動的に生成されたコードを実装するために、すべての抽象メソッドを非抽象メソッドに変換しました。しかし、クラスを非抽象化することにまだ成功していません。私が試したことは、これに似たものです:
c
非抽象にしたいクラスだとしましょう。だから私は書いた:
ただし、呼び出しは次のとおりです。
以下を上げていますCannotCompileException
:
これは、クラスのメソッドを呼び出しているため、クラスが既にロードされているためですgetName
。これが既存のクラスから取得する必要がある唯一のメカニズムのCtClass
ようですが、それが正しくない場合は誰か教えてください。このルーチンを多くのクラスに適用する必要があることを考えると、クラスのメソッドを呼び出す代わりにクラスの名前をハードコーディングすることgetName
は、理想的な解決策とは言えません。
これを行うための回避策はありますか?. まったく不可能な場合は、抽象クラスを拡張し、そのコンストラクターを実装し、すべての先祖の抽象メソッドを実装する新しいクラスを動的に生成します (もう少し複雑なので、代わりに元のクラス非抽象)。
java - Eclipse プラグインでの Javassist の使用
アプリケーションを Eclipse プラグイン、具体的には次のコードとしてデプロイするときに javassist を使用すると問題が発生します。
を投げています: javassist.NotFoundException
。
プラグインの一部として使用されていない場合、コードは正常に機能します。問題がプラグインのクラスパスの構成にあるのか (そうではないようです)、またはプラグイン プロジェクトを Eclipse アプリケーションとして実行するときに Eclipse が使用するクラスローダーに関連するものなのかを理解しようとしています。
問題を引き起こすコードは、カスタム Eclipse エディターの一部です。そのため、ユーザーがエディターに関連付けられたドキュメントを開こうとすると表示されます。javassist がロードしようとしているクラスは、プラグイン クラスの一部です。
手がかりを事前にありがとう!
java - 実際の Hibernate エンティティ タイプの代わりに Javassist タイプを取得する
私は本当に厄介な状況に出くわしました: 私はアプリのバックエンドとして Hibernate & Spring を使用していますが、場合によっては、特定のエンティティとの関係にあるエンティティが DB から通常のエンティティ オブジェクトとしてフェッチされていないようです。ただし、Javassist タイプとして。例えば:
次の関係を持つ Campaign エンティティがあります。
このキャンペーンに接続された salesAreas を取得すると、SalesArea_$$_javassist_56 のリストが取得され、ディーラーの場合は通常の Hibernate エンティティが取得されます。クライアント部分は GWT に基づいているため、ものを取得するために RequestFactory を使用します。最初はプロキシやロケーターなどに問題があると思っていましたが、これらが取得されるサービスにブレークポイントを設定し、それらを選択するとすぐに Javassist オブジェクトになります。FetchType.LAZY アノテーションを削除しても (望ましい解決策ではありませんが)、同じことが起こるようです。これは、@ManyToMany だけでなく、他のタイプの関係でも発生しました。
アノテーションには GWT 2.3、Spring 3、Hibernate 3.6.3、および JPA 2.0 を使用しています。
任意の提案をいただければ幸いです。
前もって感謝します
java - JUnit テストで Javassist を使用する
私は JUnit と Javassist について非常に浅い理解を持っていますが、それらを使用してプログラム分析を行いたいだけです。たとえば、ライブラリが与えられた場合、ランタイム中にライブラリ内のどのメソッドが呼び出されたかを知りたいとします。バイトコード操作を使用して system.out.println("method_name"); を挿入できます。メソッドの先頭にあるステートメント。そのため、実行時に、呼び出されたメソッドが出力されます。
スタンドアロン アプリケーションでは、main() が呼び出される前にインターセプトして、独自のクラス ローダーを使用できます (以下を参照)。ただし、JUnit には main() がありません。この状況でインターセプトする方法を教えてもらえますか? どうもありがとう。
編集:JUnit 4.8とJavassist 3.15.0.GAを使用しています
hibernate - 本当に、休止状態のランタイム計測を実現する方法は?
hibernate docs から、特定のケースでは、遅延読み込みが機能するために、ビルド時のインストルメンテーションが必要であることがわかっています。
Hibernate が多対 1 の関連付けられたオブジェクトを熱心にフェッチするのを止める方法
だから私は次のことをしました:
しかし、それはエラーを出しました
java.lang.VerifyError: (クラス: com/mycompany/dao/UserDaoHibernateImpl$2、メソッド: 署名: (Lcom/mycompany/dao/UserDaoHibernateImpl;II)V) スタック上のオブジェクト/配列を期待しています
これを削除すると問題が解決するため、これは間違いなく上記のインストルメンテーションによるものです。また、ウェブ検索では、これが javaasist のバグと、Spring バージョンと Hibernate バージョンの間の競合に何らかの形で関連していることも示されています。
私は休止状態3.5.6-Final、Spring 3.0.6-RELEASEを使用しています
javassist バージョンのすべての組み合わせを試し、さまざまなバージョンで javassist を asm に変更しようとしましたが、問題はまだ存在します。
ありがとうヤン
javassist - 明示的に指定されている場合、Javassist がデフォルトのアノテーション値を探すことを主張するのはなぜですか?
Javassistを使用して、 package-info
「クラス」の注釈を追加および変更しています。
場合によっては、次のエッジ ケースに対処する必要があります。誰かが (誤って)パッケージに@XmlJavaTypeAdapters
注釈を指定しましたが、属性 (必須であると定義されています) を提供していません。したがって、次のようになります。package-info
value
Javassist では、これは少し奇妙に行われます。
javassist.bytecode.annotation.Annotation
予想どおり、注釈を表す にはメンバー値 (戻り値)@XmlJavaTypeAdapters
がありません。getMemberValue("value")
null
もちろん、メンバー値を追加することは可能value()
であり、それが私が行ったことです:
上記のコード スニペットでは、 のvalue()
属性@XmlJavaTypeAdapters
が の配列であるため、注釈の配列を保持する新しいメンバー値を作成しました@XmlJavaTypeAdapter
。Zen に似たドキュメントの意図を推測するために、配列の型を指定しました。別の型を指定するとMemberValue
、これMemberValue
が何らかの形で配列の型として機能するようです。私の場合、配列の型を@XmlJavaTypeAdapter
注釈である にしたいので、MemberValue
適切と思われる唯一の種類は でしたAnnotationMemberValue
。だから私はそれらの空のものを作成し、それを配列型として設定しました。
これは、Javassist の「範囲内」にとどまっている限り、問題なく機能します。
しかし、何かがうまくいかなかったようです。Javassist に独自のアノテーションをすべて本物の Java に変換するように依頼した場合、このアノテーションの属性java.lang.annotation.Annotation
にアクセスしようとすると、Javassist はデフォルト値がないことを教えてくれます。は?value()
@XmlJavaTypeAdapters
言い換えれば、それで問題ありませんが (実際にはありません)、希望していた長さ 0 の配列を指定しました (つまり、既定値は使用しないでください。代わりに、明示的に指定した長さ 0 の配列を使用する必要があります)。 ):
この場合、なぜ Javassist はデフォルト値を探しているのでしょうか?
私のより大きな問題はもちろん、@XmlJavaTypeAdapters
それ以上の情報なしで が指定されているこの (残念ながらやや一般的な) ケースを処理することです。注釈value
の配列を保持できるメンバー値を追加する必要があります。@XmlJavaTypeAdapter
Javassist でこれを達成する方法がわかりません。いつものように、すべての助けに感謝します。
java - JavaassistとWebstart
これは解決された古い問題のように見えますが、残念ながら私は良いリファレンスを見つけることができませんでした。Javaassistを使用したJavaアプリケーションがあります。Webstartアプリケーションにアップグレードするまでは正常に機能していました。これで、JavaassistからclassNotFoundExceptionが発生します。ただし、クラスは間違いなくクラスパスにあります。
この関連する投稿https://community.jboss.org/message/302408を見つけました。これは古いもので、デコードできませんでした。誰かがここで私に手を差し伸べることができますか?
ありがとう
コードスニペットは次のとおりです。
スタックトレースには何もありません。
問題は実際にはClassLoaderです。JNLPは、Javaコマンドラインとは異なるクラスローダーを使用します。問題は、JNLPクラスローダーをJavassistとどのように調整するかです。
java - Javassist、バイトコード操作
Java クラス ファイルでクラス初期化子を見つけようとしています。メソッドは問題なく見つかりますが、main がクラス ファイルに見つからない場合は、クラス初期化子を見つけてそこにコードを挿入する必要があります。
Javassist を使用してクラスの初期化子を見つけるにはどうすればよいですか?
java - JPA/Hibernate プロキシが実際のオブジェクト データをフェッチせず、すべてのプロパティを null に設定する
私は JPA で Hibernate を使用しており、次のような関係があります。
LAZY fetch タイプを使い始めて以来、鉛筆の所有者 ( Pencil.getOwner ) を取得しようとするたびに、内部プロパティがすべて null に設定された null 以外のオブジェクトを取得します。
Hibernate によって作成されたプロキシが、必要なときにデータベースから実際のオブジェクトを取得していないようです。
何か案は?ありがとう :)