Вероятно, это плохая идея.Я подозреваю, что вам лучше заняться чем-то вроде добавления метода к компоненту, который возвращает строку типа, которая находится под вашим контролем.Простейшая такая реализация
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;
}
Это должно работать.Очевидно, вам нужно будет использовать другой класс аннотаций, если вы используете компонент с состоянием.