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

时间:2013-01-24 21:49:12

标签: java class java-ee proxy cdi

在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() ))作为此代码无需手动更改即可复制。

2 个答案:

答案 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,它将其委托存储在私有字段中。所以你需要用反射来做一些魔术来找出目标对象的实际类。