私はきれいなCDIソリューションではなくWELD依存1これまでのところ、何のために見えました...
私は@Inject @Any MyInterface豆を得ることをオブジェクトのリストのすべての要素がプロキシであれば、真Iの必要性イントロスペクションを行うために実際のオブジェクトを取得し、オブジェクトのすべてのプロパティを取得するとき、私はテストする必要があります。
マイWELD実装:
MyInterface interf = obj;
if (isProxy(interf )) {
interf = (Config) ((TargetInstanceProxy)interf ).getTargetInstance();
}
isProxyは、その(CDIソリューションは?)定義されます:
public boolean isProxy(Object obj) {
try{
return Class.forName("org.jboss.weld.bean.proxy.ProxyObject").isInstance(obj);
} catch (Exception e) {
LOGGER.error("Unable to check if object is proxy", e);
}
return false;
}
任意の提案/適応。公式ドキュメントでは、私は(イントロスペクションの言及は見られなかったここに)
そして私はこのような何かを持つBeanのすべてのプロパティを取得したいと思います:
Arrays.stream(interf.getClass().getDeclaredFields()).forEach(
field -> extractStuff(...)
);
私たちは、WildflyとWELDを使用しますが、CDIの実装にバインドする必要はありません。前もって感謝します!
編集:質問は、より正確には、次のとおりです。あなたは、溶接がされていることをクリーンCDI溶液を知っていますすでにして実装するTargetInstanceProxyを?私は学校に戻ったり、ヘルプに時間を割いてくれてありがとう..私は私が書いているものを理解していれば行く必要がない場合は!
彼らはあなたがすべきとしてinterface.Furthermoreこのいじりに対するプログラミングが奇妙なエラーを引き起こす可能性がありますときにユーザーを終了するには重要でないあるべきなCDIは、意図的に内部を隠して(というかさらすことはない)され、常にプロキシではなく、実際のインスタンスを経由してメソッドを呼び出すこと。
-だから、短い答えはノー、これを行うには、純粋なCDIの方法はありません。(意図したものではない少なくとも)。
しかし、あなたはすでに溶接を使用していることを見て、他の方法があります。溶接のAPIに依存することはかなり安全でなければなりませんので、溶接は、TomEEを除くほとんどすべてのEEサーバーが付属しています。さて、なぜ私はこれを言っている-溶接3.xの(WildFly 12+)で、APIを含むように拡張されたWeldConstruct
とWeldClientProxy
のためにこれらのクラスのJavadocを参照してください-溶接するサブクラス(インターセプター/デコレータ)および/またはクライアントプロキシのいずれかによって実装されるインタフェースであります詳しくは。
あなたがこれを行う必要がありますのであれば、その後、次のような溶接APIに依存関係を追加することができます。
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-api</artifactId>
<version>x.y.z</version>
</dependency>
注入されたオブジェクトが実行してプロキシがある場合そして、あなたのコードでは、次のことが確認できます。
@Inject
Foo foo;
public void doSomething() {
if (foo instanceof WeldClientProxy) {
// foo is a proxy
} else {
// not a proxy
}
}
あなたは、実際のインスタンスを取得したい場合は、WeldClientProxy
あなたが得ることができますMetadata
あなたがすることができ、そこから基礎となるコンテキストインスタンスを取得。それは私はあなたが後にしているものにあなたを得ることができる最も近いです。