在Java中,如何獲取Java EE(CDI)代理的原始類對象和/或類名?代理的原始類名(無需手動字符串操作)
當代理實例使用getName()
,返回的名稱是一樣的東西
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
是否有一些functionaliy的Java SE(7)或EE(6)將返回原來的,非代理類實例或它的名字?
我需要:
com.company.employeemgmt.EmployeeManager
當然,我可以簡單地使用字符串操作,但我想知道如果這樣的功能已經是Java的(EE)-inbuilt。
我已經找到java.reflect.Proxy
,我可以用它來檢測代理:
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
...
}
...,但你會如何取消引用原班?
更新:
訣竅將訪問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並不指定使用什麼技術進行代理或以任何方式從代理獲取Managed Bean的Class細節(儘管您可以從BeanManager API開始並向前工作而不是從Object向後) – covener