問題タブ [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 - 実行時の Java オブジェクトの拡張
プロキシ対応ライブラリ (javassist、JDK 動的プロキシなど) を使用すると、実行時にインターフェイスを実装するようにクラスを拡張できることを認識しています。
私の質問は次のとおりです。インスタンス化されたオブジェクトを拡張して、実行時にインターフェイスを実装することは可能ですか (同様に、適切なメソッド ハンドラーを提供します)。
java - Javassist。主なアイデアと実際の用途は何ですか?
Javassist は、アプリケーションの Java バイトコードを操作する手段を提供する Java ライブラリです。
わかりましたが、なぜバイトコードを操作する必要があるのでしょうか?
実際の例はありますか?javassistが使用した実際のアプリはありますか?
java - Javassistでメソッド本体を変更した後、なぜ.toClass()を呼び出さなければならないのですか?
getMessage()
私はJavassistによって私のメソッド本体を次のように変更TestClass
します:
それはうまくいきます。ただし、ctClass.toClass()
メソッド呼び出しを削除すると、本文の置換が機能しません。なんで?
getMessage()
メソッドの本体を正しく置き換えるにはどうすればよいですか?私はそれを正しくやっていますか?
java - Javassistでプリミティブ型のクラスを取得するには?
私のプログラムでは、クラスとプリミティブ型を扱います。プログラムがクラスを見つけた場合、次の呼び出しのいずれかを実行します。
Class.forName(classname)
cc.toClass()
cc
のインスタンスはどこですかCtClass
ただし、プリミティブ型が見つかった場合、事態はさらに悪化します。
Class.forName
は使用できません。プリミティブ型では使用できません。cc.toClass()
戻り値null
プリミティブ型のラッパー クラスからフィールドを呼び出すことはTYPE
可能ですが、リフレクションでどのように行うことができますか?
これが私のコードです:
Javassist 3.12.0.GA
編集:以下のアンサーで選択したソリューションを 投稿しました。とにかく、トムの答えにチェックを入れました。
delegates - この委任者を理解する方法
私はactivejdbcのソースを読んでいますが、これらのメソッドはModelInstrumentationにあります。
このクラスは、モデル クラスを拡張するために使用されます。最初のクラスは、最初instrument
にすべての非プライベート メソッドorg.javalite.activejdbc.Model
をその子モデル クラスに委譲します。つまり、そのようなメソッドを子に追加します。
デリゲートがなくてもこれらのメソッドを呼び出すことができるため、なぜこれを行うのかわかりません。
hibernate - 自動ディスカバリによる動的に作成されたエンティティのロード
私は奇妙なDB構造で作業する必要があります。本番環境では、同じ列を持つより多くのテーブルが存在する可能性があります。そして、エンティティ/JPQL クエリによって、それらを処理する JPA (Hibernate) を使用したいと考えています。アイデアは、実行時に JVM 内で各テーブルのエンティティ クラスを動的に作成することです。このアプローチはうまく機能します。Javassist でエンティティを作成します - 既存のコンパイル済みエンティティを使用し、それに動的に注釈を追加します (エンティティ、テーブル):
Configuration オブジェクトから手動で Hibernate SessionFactory を構築し、addAnnotatedClass メソッドを使用してこのクラスを Configuration に追加すると、正常に動作します。問題は自動検出にあり、エンティティはJPAでもAnnotationSessionFactoryBeanでも検出/検出されません-Springコンテキスト内でパッケージスキャンを使用すると。(私は取得:「QuerySyntaxException: [MyEntity] がマップされていません」例外)
Class.forName(myNewEntityName) は機能します。つまり、クラスローダー内で初期化されます。
(もちろん、これがこれらのテーブルを処理するための理想的な設計パターンではないことはわかっています。)
問題は、なぜ、どのようにそれをソール化するのかということです。
(Javassist 3.15.0-GA、hibernate コア 3.6.6.Final、hibernate-entitymanager 3.5.6-Final)
java - ClassPool.getDefault(); Javassist では何もしません
で何が起こる可能性がありClassPool.getDefault();
ますか?
java - 動的に生成された Java クラスのソース コードの取得
私は (Javassist を使用して) 新しいクラスを動的に生成しており、そのような生成されたクラスのソース コードを取得できるようにしたいと考えています。
プログラムでバイトコードを逆コンパイルするためのライブラリはありますか?. 逆コンパイルしたいバイトコードはファイルシステムには存在せず、メモリにのみ存在することに注意してください。
java - Javassistを使用してソースコードからクラスをロードする方法は?
入力ストリームにクラスの完全なソース コードがあります。Javassist を使用しCtClass
てこのクラスの新しいオブジェクトを作成することはできますか?
CtClass
クラスの名前を使用して、次のような新しいオブジェクトを作成できることを知っています。
しかし、私の場合、クラスの名前は事前にわかりませんが、完全なソース コードだけです (もちろん、ソース コードを解析してクラスの名前を取得することはできますが、これがクラスの一部であるとは言わないでください)。解決 :-) )
java - javassistでクラスのコピーを作成するにはどうすればよいですか?
Javassistを使用して、自分が持っているクラスとまったく同じクラスを作成するにはどうすればよいですか。ただし、名前は異なります。すべてのランタイムアノテーションも保持したいと思います。