Javaでは、Java EE(CDI)プロキシの元のクラスオブジェクトおよび/またはクラス名をどのように取得しますか?プロキシのオリジナルクラス名(手作業による文字列操作なし)
プロキシインスタンスでgetName()
を使用して、返された名前がある
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
ようなものがでいくつかのfunctionaliyがあるのJava SE(7)またはEE(6)の元、unproxiedクラスのインスタンスのいずれかを返すようまたはその名前?
私は必要があります。もちろん
com.company.employeemgmt.EmployeeManager
を、私は単純に文字列操作を使用することができますが、私はそのような機能がすでにJavaベース(EE)-inbuiltであるかどうかを知りたいです。 ...
public static void doSomething(Class<? implements Serializable> managerClass)
{
if (Proxy.isProxyClass(managerClass))
{
// unproxy how?
managerClass = managerClass.getUnproxiedClass();
}
// delegate
doSomething(managerClass.getName());
}
public static void doSomething(String prefix)
{
// do real work
...
}
が、どのように元のクラスを間接参照になります。
私はすでに、私はプロキシを検出するために使用することができjava.reflect.Proxy
を見つけましたか?
更新:
トリックはMyUtil.doSomething(EmployeeManager.class)
(またはMyUtil.doSomething(EmployeeManager.class.getName())
)にアクセスすることですが、このコードは手動で変更することなく、周りにコピーすることができるように私は/使用するすべてのクライアントからMyUtil.doSomething(this.getClass())
(またはMyUtil.doSomething(this.getClass().getName())
)を渡したいです。
と
テスト、それはあなたがしようとしましたmanagerClass.getDeclaringClass()またはmanagerClass.getEnclosingClass()? – jdb
両方ともnullを返します。 – Kawu
あなたがここで行うことは、移植性があり安定していません。プロキシは実際には他のクラスにのみ関連しています。CDIは、どの技術がプロキシに使用されているか、あるいはプロキシからクラスの詳細(マネージドBeanのBeanManager APIから始めることはできますが、オブジェクトから後方に進むことはできません)には何もしません。 – covener