我有一些代码:
@EJB
protected SomeService service;
// Somewhere in a method
service.getClass().getSimpleName();
我正在寻找的是EJB类的名称,在这种情况下应该是SomeServiceBean
的行。但是,我得到的是例如$Proxy2128
。
有没有办法可以获得我实现的实际EJB类的名称,而不是代理类?
认为我们正在使用ejb 3.0与geronimo或类似的东西。
答案 0 :(得分:2)
这样做可能不是一个好主意。我怀疑你最好做一些事情,比如在bean中添加一个返回你控制下的类型字符串的方法。最简单的实现
public String getSimpleClassName() {
return getClass().getSimpleName();
}
面对代理是安全的。面对动态子类化并不安全,但我不知道任何那样做的EJB实现(虽然肯定有JPA实现可以做到这一点)。
稍微复杂但实质上更直接的实现是定义:
public abstract String getSimpleClassName();
在基类(或接口)中,然后编写:
public String getSimpleClassName() {
return SomeService.class.getSimpleName();
}
在SomeService中。这是铸铁保证有效。
或者,如果您正在使用无界面视图,并且不介意反思,并且系统随时都会冒着火焰的风险,那么在调用代码中,您可以执行以下操作:
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,则需要使用不同的注释类。