Kaw*_*awu 10 java proxy class java-ee cdi
在Java中,如何获取Java EE(CDI)代理的原始类对象和/或类名?
在getName()代理实例上使用时,返回的名称就像
com.company.employeemgmt.EmployeeManager$Proxy$_$$_WeldSubclass
Run Code Online (Sandbox Code Playgroud)
Java SE(7)或EE(6)中是否有一些功能可以返回原始的,未经过代理的类实例或其名称?
我需要:
com.company.employeemgmt.EmployeeManager
Run Code Online (Sandbox Code Playgroud)
当然,我可以简单地使用字符串操作,但我想知道这些功能是否已经是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
...
}
Run Code Online (Sandbox Code Playgroud)
...,但你怎么解除原来的课程呢?
更新:
诀窍是访问MyUtil.doSomething( EmployeeManager.class )(或 MyUtil.doSomething( EmployeeManager.class.getName() )),但我想使用/传递MyUtil.doSomething( this.getClass() )(或 MyUtil.doSomething( this.getClass().getName() ))来自所有客户端,因为这些代码可以被复制而无需手动更改.
这取决于。您可以使用Proxy.getInvocableHandler(manager)获取代理的InitationHandler。唉,InvocalHandler 是一个只有一个方法的接口,并且没有让您获得目标类的功能;这一切都取决于实施。invoke
例如,CXF Web 服务框架有一个客户端并使用ClientProxy作为关联的调用处理程序,您可以这样获取客户端:
ClientProxy handler = (ClientProxy)Proxy.getInvocationHandler(proxiedObject);
Client client = handler.getClient();
Run Code Online (Sandbox Code Playgroud)
雪上加霜的是,您可能使用的WeldInvocalHandler似乎只是将调用委托给org.jboss.wsf.spi.invocal.InvocalHandler,并将其委托存储在私有字段中。因此,您需要使用反射做一些魔术来找出目标对象的实际类。