In Java, come si ottiene l'oggetto classe originale e/o il nome classe di un proxy Java EE (CDI)?Nome classe originale di un proxy (senza manipolazione manuale delle stringhe)
Quando si utilizza getName()
su un'istanza di proxy, il nome restituito è qualcosa di simile
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
C'è qualche functionaliy in Java SE (7) o EE (6) che restituirà sia l'istanza originale di classe unproxied o il suo nome?
Ho bisogno:
com.company.employeemgmt.EmployeeManager
Naturalmente, si potrebbe semplicemente usare la manipolazione di stringhe, ma vorrei sapere se tale funzionalità è già su Java (EE) -inbuilt.
ho già trovato java.reflect.Proxy
, che ho potuto utilizzare per rilevare i 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
...
}
..., ma come si farebbe dereferenziare classe originale?
Aggiornamento:
Il trucco sarebbe quello di accedere MyUtil.doSomething(EmployeeManager.class)
(o MyUtil.doSomething(EmployeeManager.class.getName())
), ma vorrei usare/pass MyUtil.doSomething(this.getClass())
(o MyUtil.doSomething(this.getClass().getName())
) da tutti i client come questo codice può essere copiato in giro senza modifiche manuali .
Hai provato managerClass.getDeclaringClass() o managerClass.getEnclosingClass()? – jdb
Entrambi restituiscono null. – Kawu
Niente di quello che fai qui sarebbe portatile o stabile. Il proxy è in realtà solo "correlato" all'altra classe.Il CDI non stabilisce quale tecnologia viene utilizzata per il proxy o alcun modo per ottenere da un proxy i dettagli della classe del bean gestito (sebbene sia possibile iniziare con l'API BeanManager e lavorare avanti anziché indietro da un oggetto) – covener