Java Экземпляр EE CDI | Как получить настоящий класс - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь добраться до реальных классов экземпляра, который я внедрил через CDI. Я получаю только обозначение в виде имени класса, которое состоит из имени интерфейса, последовательности чисел и строки символов «$ Proxy $ _ $$ _ 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 должна go пройти через все определенные экземпляры и вернуть значение аннотации TestProvider в виде списка. Я ожидал бы следующего списка.

  • TestConnector1
  • TestConnector2

Но экземпляры, которые я получил, относятся к типу de.test.con1.TestConnector $ 710153185 $ Proxy $ _ $$ _ Weld $ EnterpriseProxy $ или de.test.con2.TestConnector $ 219965632 $ Proxy $ _ $$ _ Weld $ EnterpriseProxy $

Как я могу прочитать значения, которые я ищу для?

1 Ответ

2 голосов
/ 10 августа 2020

Ваши экземпляры TestConnector проксируются Weld, вероятно, потому, что они находятся в нормальной области . Это нормально и ожидаемо.

Следовательно, ваш вопрос: «Учитывая (определенный Weld) прокси-класс, как мне получить имя« реального »класса, который он проксирует?»

Не существует способа гарантированной работы, но этот способ будет работать с реализациями CDI Weld:

Прокси-классы Weld имеют установленный флаг SYNTHETIC и в общем, расширьте класс, который они проксируют. Я не думаю, что это гарантировано, но так было во многих версиях и уже много лет.

...