代理的原始类名(无需手动字符串操作)

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() ))来自所有客户端,因为这些代码可以被复制而无需手动更改.

tah*_*agh 5

由于代理类继承自原始类,因此我认为您可以通过获取代理超类来获取原始类。


nd.*_*nd. 4

这取决于。您可以使用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,并将其委托存储在私有字段中。因此,您需要使用反射做一些魔术来找出目标对象的实际类。