在Java中,如何获得Java EE(CDI)代理的原始类对象和/或类名?
在代理实例上使用getName()
时,返回的名称类似于
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
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() )
)作为此代码无需手动更改即可复制。
答案 0 :(得分:5)
由于代理类继承自原始类,我认为您可以通过获取代理超类来获取原始类。
答案 1 :(得分:4)
取决于。您可以使用InvocationHandler获取代理的Proxy.getInvocationHandler(manager)。唉,InvocationHandler是一个只有一个invoke
方法的接口,没有任何功能可以让你获得目标类;这一切都取决于实施。
作为示例,CXF Web服务框架具有Client并使用ClientProxy作为关联的调用处理程序,您可以这样获取客户端:
ClientProxy handler = (ClientProxy)Proxy.getInvocationHandler(proxiedObject);
Client client = handler.getClient();
为了增加对伤害的侮辱,似乎您可能使用的WeldInvocationHandler只是将调用委托给org.jboss.wsf.spi.invocation.InvocationHandler,它将其委托存储在私有字段中。所以你需要用反射来做一些魔术来找出目标对象的实际类。