我有一些代码沿着大致如下:
@EJB protected SomeService service; // Somewhere in a method service.getClass().getSimpleName();
我所寻找的是EJB类的名称,在本例中应该是沿着SomeServiceBean这样的名称,但我得到的却是$Proxy2128。有没有一种方法可以获得我实现的实际EJB类的名称,而不是代理类的名称?
SomeServiceBean
$Proxy2128
6rqinv9w1#
这样做可能不是一个好主意。我想你最好做一些事情,比如向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; }
显然,如果您使用的是有状态bean,则需要使用不同的注解类。
sg3maiej2#
我不知道这是否适用于您的情况,但我遇到过类似的情况,我有一个拦截器来自动记录方法调用,我需要记录完整的类名,但通过使用getClass().getName(),代理的类名被打印出来,而不是这样,我使用getClass().getSuperclass().getName()来获得原始类名。
getClass().getName()
getClass().getSuperclass().getName()
2条答案
按热度按时间6rqinv9w1#
这样做可能不是一个好主意。我想你最好做一些事情,比如向bean添加一个方法,该方法返回一个受你控制的类型字符串。最简单的实现
这在代理中是安全的,在动态子类化中是不安全的,但是我不知道有任何EJB实现这样做(尽管肯定有JPA实现这样做)。
稍微复杂但基本上更直接的实现是定义:
在基类(或接口)中,然后编写:
在某些服务中。这是保证工作的铸铁。
或者,如果您使用的是无接口视图,并且不介意反射,也不介意系统在任何时候爆发的风险,那么在调用代码中,您可以执行以下操作:
显然,如果您使用的是有状态bean,则需要使用不同的注解类。
sg3maiej2#
我不知道这是否适用于您的情况,但我遇到过类似的情况,我有一个拦截器来自动记录方法调用,我需要记录完整的类名,但通过使用
getClass().getName()
,代理的类名被打印出来,而不是这样,我使用getClass().getSuperclass().getName()
来获得原始类名。