問題タブ [cglib]
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 - 実行時に Spring Bean 定義を XmlWebApplicationContext にロードした後の CGLIB プロキシ エラー
実行時に追加のシングルトン Bean 定義を外部 jar ファイルからアプリケーションの既存の XmlWebApplicationContext に読み込みます。
結局のところ、上記の xmlWebApplicationContext には、Bean のすべての外部定義が含まれています。しかし、コンテキスト例外からBeanを取得しようとすると、スローされます:
Couldn't generate CGLIB proxy for class ...
デバッグ モードで、Bean の初期化プロセスで初めてプロキシが生成されるのを見ました。
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator
そして、プロキシを生成しようとするよりも
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
しかし、言及された例外で失敗します。
java - HibernateでのJavassistの失敗:無効な定数タイプ:60
既存のアプリケーションを管理するためのCLIツールを作成しています。アプリケーションとテストの両方が正常にビルドされ、正常に実行されますが、jar内に存在するCLIツールを実行するとjavassistエラーが発生します。
ユニットテストと統合テストが実行されるのでjarが正常であることがわかっているので、javassistの問題である可能性があると考えたので、cglibを試しました。バイトコードプロバイダーはcglibとして表示されますが、javassistが存在するまったく同じスタックトレースを取得します。
cglibは間違いなくクラスパスにあります:
hibernate 3.4と3.5の両方で試しましたが、まったく同じエラーが発生します。これはjavassistの問題ですか?
更新:Eclipse内でアプリケーションを正常に実行できますが(右クリック->実行-> Javaアプリケーション)、mavenで生成されたjar-with-dependenciesの使用は失敗します。違いは、Eclipseではjavassistが含まれているjarを検査するのではなく、すべてのクラスファイル(およびおそらくいくつかの依存するサードパーティのjar)を検査することだと思います。
java - 実行時のオーバーヘッドなしでインターフェイスをモックする安価な方法
テスト用にモックしたい多くのメソッドを持つインターフェイスがあり、何もする必要がなく、テスト対象のオブジェクトにそのインスタンスが必要なだけだとします。たとえば、特定のコードに対していくつかのパフォーマンス テスト/ベンチマークを実行したいのですが、このインターフェイスのメソッドが寄与することは望ましくありません。
それを簡単に行うためのツールはたくさんあります。たとえば、
または何でも。
ただし、それらにはすべて実行時のオーバーヘッドが伴いますが、これは避けたいものです。
- Mockito はすべての呼び出しを記録し、後で検証するために引数を隠します
- JMock など (私は信じています) では、何をするのかを定義する必要があり (それほど大したことではありません)、実行はさまざまな種類のプロキシを経由して実際にメソッドを呼び出します。
- 古き良き java.lang.reflect.Proxy とその仲間たちは、呼び出されるメソッドに到達する前に、スタック上で少なくともあと数回はメソッド呼び出しを行います。
(これらの例の詳細については喜んで修正しますが、原則は成り立つと思います。)
私が目指しているのは、インターフェイスの「実際の」操作なしの実装です。たとえば、すべてがnull
、false
またはを返すように手動で書くことができます0
。しかし、私が怠け者で、インターフェイスにメソッドがたくさんある場合、それは役に立ちません。では、実行時に任意のインターフェイスのこのようなノーオペレーション実装を生成してインスタンス化するにはどうすればよいでしょうか?
バイトコード生成を使用する Powermock や CGLib などの利用可能なツールがありますが、より大きなモッキング/プロキシ コンテキストの一部としてのみであり、内部から何を選択するかはまだわかりません。
OK、例は少し不自然かもしれませんし、プロキシがタイミングに大きな影響を与えるとは思えませんが、そのようなクラスを生成する方法に興味があります. CGLib、ASMで簡単?
編集: はい、これは時期尚早の最適化であり、実際に行う必要はありません。この質問を書いた後、最後の文は、私が与えた実際のユースケースよりも、原則としてそれを行う方法と、動的クラス生成への簡単な方法に興味があるという私の主張を十分に伝えていなかったと思います。最初から言葉遣いが悪いのかもしれません。
java - CGLIBプロキシクラスをSpringFrameworkのReflectionUtilsで動作させるにはどうすればよいですか?
implは@Repository@Transactionalアノテーションの両方を使用するため、cglibプロキシクラスがあります。
Springのreflectionutilsを使用して、フィールドの1つをモックアウトするためのフィールド値を設定したいと思います。
しかし、リフレクションutilsが私のクラスでフィールドを見つけることができないとき。
どうすればこれを機能させることができますか?だから私はフィールド(コラボレーター)をモックアウトすることができます。
cglib - CGLIB の BeanGenerator を介して生成された Bean に状態を追加する
Java Bean を動的に作成する方法については、次のサンプル コードを参照してください。私が理解できないのは、作成されたインスタンスの状態を更新する方法です。次の例では、foo の値を「footest」に設定するにはどうすればよいでしょうか。
BeanGenerator bg = 新しい BeanGenerator();
bg.addProperty("foo", Double.TYPE);
bg.addProperty("バー", String.class);
オブジェクト Bean = bg.create();
ありがとうクマール
java - 抽象DAOパターンとSpringの「プロキシをキャストできません...」の問題!
私はこれが非常に頻繁に尋ねられることを知っています、しかし私は実用的な解決策を見つけることができません:
これは私のAbstractDAOです:
そして、これは私のJPAの実装です。
そしてこれは1つのエンティティのdaoです:
その実装は次のとおりです。
アーキテクチャ全体は単純です:
インターフェイスAbstractDaoは、単純なCRUDメソッドを定義します。
インターフェイスPersonDaoは、アドオンメソッドなしでAbstractDAOを拡張します。
クラスAbstractDaoJpaImplは、JPAによるAbstractDaoの実装を定義します。
クラスPersonDaoImplは、AbstractDaoJpaImplを拡張し、aditionalMethods ()を追加するPersonDaoANDOtherInterfaceを実装します。
、PersonDaoImplはPersonDaoのみを実装し、OtherInterface.additionalMethods()を実装しない場合、すべてが正常に機能します。
使うことができます
私の春のXMLファイルで。
しかし、PersonDaoImplはOtherInterfaceを実装します。テスト/実行するとき、DAOをPersonDaoからPersonDaoImplまたはOtherInterfacesにキャストする必要があります。
この問題は(PersonDaoImpl) dao
、「プロキシをPersonDaoImplにキャストできません」という例外をスローする場合に発生します。
これはグーグルするときによく聞かれます、誰もがに追加proxy-target-class="true"
することを提案し<tx:annotation-driven>
ます:
これにより、JDKの動的プロキシの代わりにCGLIBが使用されます。
しかし、Springを初期化するときに別の例外をスローします:
AbstractDaoJpaImplのコンストラクター:
すべての質問はここで止まります、私は今、実用的な解決策を見つけることができません。
誰かが私に実用的な解決策を与えることができますか?どうもありがとう !
環境:Spring-3.0.4、javaee-api-6.0、javax.inject、cglib-2.2、hibernate-jpa-2.0-api-1.0.0、
java - Java、動的にインターフェースを作成しますか?
実行時にインターフェースを作成するためのソリューションを探しています。とにかくこれが可能かどうかは本当にわかりません。
問題:
Map<String,String>
キーがこのサービスのアクションを定義する場所を公開するOSGiサービスがあります。このサービスを春のサービスとして直接公開したいのですHessian
が、そのためにはインターフェースを削除する必要があります。次に、実行時にこのインターフェイスを作成します。
java - cglibを使用してパッケージローカルメソッドをオーバーライドする
cglibを使用してライブラリユーザーが提供する抽象クラスのサブクラスを作成し、ユーザーがそこに残した抽象メソッドの自動生成された実装を提供するJavaライブラリを使用しています。
私の問題は、問題のメソッドがパッケージローカル(つまりデフォルト)のアクセス可能性を持っている場合、私が作成したメソッドは明らかに無視され、ユーザーが呼び出されたときにAbstractMethodErrorを受け取ることです。
私が生成するクラスは、元のクラスと同じパッケージにあります(original.package.OriginalClassName_AutomaticImplementationという名前のクラスを生成します)が、もちろん別のクラスローダー(つまり、cglibによって生成されたバイト配列をロードするクラス)によってロードされますディスクファイルより); 私の疑いは、これが問題だということです。もしそうなら、それを回避する方法はありますか?
c# - 誰かがcglibMulticastDelegateを使用してC#イベントのようなことをするためのサンプルコードを持っていますか?
C#はJavaの委任とイベントを言語でサポートしていますが、バインディングには匿名の内部クラスを使用するか、リフレクションコードhttp://oatv.com/pub/a/onjava/2003/05/21/delegates.htmlを使用する必要があります。そのページのコメントには、CGLibマルチキャストデリゲートに関するヒントがありますが、Googleコードはそのクラスのサンプルコードについて知らないようです。誰かが実際の例へのリンクを持っていますか?他の人は彼らの指先にそれを持っていますか?
java - cglib コンパイラ jdk 準拠
同僚のボックスで奇妙なエラーが発生します。CGLib は、Spring AOP ロギングのサービス クラスを自動プロキシし、実行時に、cglib プロキシ クラスによる fastclass で「未解決のコンパイル エラー: スーパークラス メソッドをオーバーライドする必要があります」と表示されます。
問題のあるクラスでは、インターフェイスを実装するときに @override アノテーションを使用しています。jdk 1.6 ではサポートされていますが、1.5 ではサポートされていません。CGLib はその実装クラスを自動プロキシしています。
ただし、jdk_1.6_17 を使用した私のボックスでは正常に動作しますが、jdk_1.6_10 を使用した彼のボックスでは動作しません。
ただし、同じ jdk を使用する maven を使用して、プロジェクトを正しくコンパイルできます。@Override アノテーションを削除すると、ランタイム cglib エラーが修正されますが、それはおかしいですよね?
cglib が自動プロキシに使用するコンパイラは何ですか?これは jdk_1.6_10 のバグである可能性がありますか、それとも他に何か不足していますか?
spring 3.0.4、jboss 5.10、spring security 3.0.3 を使用
基本的に、クラスは spring-security で AuthenticationUserDetailsService を実装します。
問題のあるメソッド シグネチャ:
UserDetails はスプリング セキュリティ インターフェイスであり、Authentication も同様です。