Java EE CDI实例|如何获得真正的类



我正试图获得通过CDI注入的实例的真实类。我只得到一个类名,它由接口的名称、一系列数字和字符串"组成$代理$_$$_Weld$EnterpriseProxy$"。

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TestProvider {
String value();
}
public interface TestConnector {
}
@TestProvider("TestConnector1")
@Stateless
public class Test1 implements TestConnector {
}
@Default
@TestProvider("TestConnector2")
@Stateless
public class Test12 implements TestConnector {
}
@Stateless
public class TestFactory {

@Inject
@Any
private Instance<TestConnector> testConnectors;

public TestConnector getConnector(String name) {
...
}

public Set<String> listAllTestConnectorNames(){
try {
Set<String> connectors = new HashSet<String>();

this.testConnectors.forEach(con -> {
System.out.println(con.getClass().getName());
for(Annotation x : con.getClass().getAnnotations()) {
if(x instanceof TestProvider) {
String name = ((TestProvider) x).value();
System.out.println(name);
connectors.add(name);
}
}
this.testConnectors.destroy(con);
});

return connectors;
} catch(Exception e) {
...
}
}

函数listAllTestConnectorNames应该遍历所有已确定的实例,并将注释TestProvider的值作为列表返回。我希望得到以下清单。

  • 测试连接器1
  • 测试连接器2

但我收到的实例类型为de.test.co1.TestConnector$710153185$Proxy$_$$_ Weld$EnterpriseProxy$或de.test.con.TestConnector 219965632$代理$_$$_焊接$EnterpriseProxy$

我怎样才能读出我正在寻找的价值观?

您的TestConnector实例由Weld代理,可能是因为它们在正常范围内。这很好,也是意料之中的事。

因此,你的问题是:;给定一个(Weld定义的(代理类,如何获得它代理的"真实"类的名称">

没有保证工作的方法,但这种方法将适用于CDI:的Weld实现

Weld的代理类上设置了SYNTHETIC标志,通常会扩展它们代理的类。我不认为这是有保证的,但这在很多版本和很多年前都是真的。

所以,如果你做了这样的事情:

Class<?> c = proxyClass;
while (c.isSynthetic()) {
c = c.getSuperclass();
}
// Now c is the "real" class
System.out.println(c.getName()); // shouldn't be a proxy class name anymore

……你应该表现得很好。

最新更新