1 package net
.aramzamzam
.commons
.hibernate
.utils
;
3 import java
.lang
.reflect
.Constructor
;
4 import java
.lang
.reflect
.InvocationTargetException
;
6 import javax
.persistence
.Entity
;
8 import org
.hibernate
.cfg
.Environment
;
11 * Утилитный класс для операций над классами и метаданными
13 * @author М.А. Алексеев (SVN alexeev)
16 public final class ClassUtils
{
19 * Возвращает суперкласс, который аннотирован как Entity.
20 * Дело в том, что в списки или в отчеты могу передаваться
21 * подклассы - DTO или еще какие-то надстройки, но при этом бывает
22 * необходимость понимать, с какой сущностью мы при этом реально работаем.
23 * @param clazz подкласс BasicEntity
25 * @return clazz или один из его суперклассов, который является Hibernate Entity
27 // TODO alexeev: неплохо бы тут сделать кеширование, потому что набор потенциальных
28 // аргументов невелик. Тапестревое @Cached не подошло.
29 @SuppressWarnings("unchecked")
30 public static Class
getEntityClass(Class clazz
) {
31 if (clazz
.getAnnotation(Entity
.class) != null)
33 Class
<?
> s
= clazz
.getSuperclass();
34 if (s
.getAnnotation(Entity
.class) != null)
37 return getEntityClass(clazz
);
38 throw new IllegalArgumentException("Class is not a successor of any annotated @Entity!");
42 * возвращает не-проксированный класс
43 * @param proxy класс, сгенеренный проксей
45 public static Class
<?
> stripProxy(Class
<?
> proxy
) {
46 int proxyStart
= proxy
.getCanonicalName().indexOf("_$$"); // javaassist
49 return Class
.forName(proxy
.getCanonicalName().substring(0, proxyStart
));
50 } catch (ClassNotFoundException cnfe
) {
54 proxyStart
= proxy
.getCanonicalName().indexOf("$$"); // cglib
57 return Class
.forName(proxy
.getCanonicalName().substring(0, proxyStart
));
58 } catch (ClassNotFoundException cnfe
) {
66 * Возвращает имя хиберовской энтити по замапленному классу
67 * @param entity замапленный класс
68 * @return имя энтити либо null, если класс не замаплен
70 public static String
getEntityName(Class
<?
> entity
) {
71 Entity entityAnn
= entity
.getAnnotation(Entity
.class);
72 if ( entityAnn
== null ) return null;
73 return ( org
.hibernate
.cfg
.BinderHelper
.isDefault( entityAnn
.name() ) ) ?
74 entity
.getSimpleName() : entityAnn
.name();
77 public static Class
<?
> getClassByString(String clazz
)
79 ClassLoader
[] classLoaders
= new ClassLoader
[]{Thread
.currentThread().getContextClassLoader(), Environment
.class.getClassLoader()};
80 for (ClassLoader classLoader
: classLoaders
) {
82 return classLoader
.loadClass(clazz
);
83 } catch (ClassNotFoundException e
) {
91 public static <T
> T
createObject(Class
<T
> clazz
)
94 Constructor
<T
> c
= clazz
.getConstructor();
95 return c
.newInstance();
96 } catch (SecurityException e
) {
98 } catch (IllegalArgumentException e
) {
100 } catch (NoSuchMethodException e
) {
102 } catch (InstantiationException e
) {
104 } catch (IllegalAccessException e
) {
106 } catch (InvocationTargetException e
) {