Java EJB的类名

Java EJB的类名,java,ejb,Java,Ejb,我有一些这样的代码: @EJB protected SomeService service; // Somewhere in a method service.getClass().getSimpleName(); 我要查找的是EJB类的名称,在本例中,它应该是类似于SomeServiceBean的名称。然而,我得到的是例如$Proxy2128 是否有一种方法可以获得我实现的实际EJB类的名称,而不是代理类的名称 我想我们正在使用EJB3.0与geronimo或类似的东西。这样做可能不是一个

我有一些这样的代码:

@EJB
protected SomeService service;

// Somewhere in a method
service.getClass().getSimpleName();
我要查找的是EJB类的名称,在本例中,它应该是类似于
SomeServiceBean
的名称。然而,我得到的是例如
$Proxy2128

是否有一种方法可以获得我实现的实际EJB类的名称,而不是代理类的名称


我想我们正在使用EJB3.0与geronimo或类似的东西。

这样做可能不是一个好主意。我怀疑您最好做一些事情,比如向bean添加一个方法,该方法返回一个由您控制的类型字符串。这种实现最简单

public String getSimpleClassName() {
    return getClass().getSimpleName();
}
这是安全的面对代理。面对动态子类化是不安全的,但我不知道有任何EJB实现可以做到这一点(尽管肯定有JPA实现可以做到这一点)

一个稍微复杂但基本上更直接的实现是定义:

public abstract String getSimpleClassName();
在基类(或接口)中,然后写入:

public String getSimpleClassName() {
    return SomeService.class.getSimpleName();
}
在某处服役。那是保证工作的铸铁

或者,如果您在没有界面视图的情况下工作,并且不介意反射,并且您的系统在任何时候都有起火的风险,那么在调用代码中,您可以执行以下操作:

private String findBeanClassName(Object beanRef) {
    return findBeanClass(beanRef).getSimpleName();
}

private Class<?> findBeanClass(Object beanRef) {
    return findAncestorWithAnnotation(beanRef.getClass(), Stateless.class);
}

private Class<?> findAncestorWithAnnotation(Class<?> cl, Class<? extends Annotation> annotation) {
    while ((cl != null) && !cl.isAnnotationPresent(annotation)) {
        cl = cl.getSuperclass();
    }
    return cl;
}
私有字符串findBeanClassName(对象beanRef){
返回findBeanClass(beanRef).getSimpleName();
}
私有类findBeanClass(对象beanRef){
返回findAncestorWithAnnotation(beanRef.getClass(),无状态.class);
}

私有类findAncestorWithAnnotation(类cl,ClassI不认为这是可能的,因为它不应该是。你为什么想要这个类名?如果你对这类信息感兴趣,最好创建两个不同的接口,由一个bean实现。然后你可以根据不同的接口进行区分。是的,我最后做了一些类似于上一个的事情。我只是使用这是一种日志记录,查看用于执行特定操作的内容。