DataCheckbox component
[aramzamzam-commons.git] / aramzamzam-commons / commons-hibernate / src / main / java / net / aramzamzam / commons / hibernate / utils / ClassUtils.java
blobb0485122db7b59475206c296d4f269ca21509fda
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;
10 /**
11 * Утилитный класс для операций над классами и метаданными
12 * их экземпляров.
13 * @author М.А. Алексеев (SVN alexeev)
14 * 07.06.2008
16 public final class ClassUtils {
18 /**
19 * Возвращает суперкласс, который аннотирован как Entity.
20 * Дело в том, что в списки или в отчеты могу передаваться
21 * подклассы - DTO или еще какие-то надстройки, но при этом бывает
22 * необходимость понимать, с какой сущностью мы при этом реально работаем.
23 * @param clazz подкласс BasicEntity
24 * @return
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)
32 return clazz;
33 Class<?> s = clazz.getSuperclass();
34 if (s.getAnnotation(Entity.class) != null)
35 return s;
36 if (s!=null)
37 return getEntityClass(clazz);
38 throw new IllegalArgumentException("Class is not a successor of any annotated @Entity!");
41 /**
42 * возвращает не-проксированный класс
43 * @param proxy класс, сгенеренный проксей
45 public static Class<?> stripProxy(Class<?> proxy) {
46 int proxyStart = proxy.getCanonicalName().indexOf("_$$"); // javaassist
47 if (proxyStart > 0) {
48 try {
49 return Class.forName(proxy.getCanonicalName().substring(0, proxyStart));
50 } catch (ClassNotFoundException cnfe) {
51 return null;
54 proxyStart = proxy.getCanonicalName().indexOf("$$"); // cglib
55 if (proxyStart > 0) {
56 try {
57 return Class.forName(proxy.getCanonicalName().substring(0, proxyStart));
58 } catch (ClassNotFoundException cnfe) {
59 return null;
62 return proxy;
65 /**
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) {
81 try {
82 return classLoader.loadClass(clazz);
83 } catch (ClassNotFoundException e) {
84 //ignore
87 return null;
91 public static <T> T createObject(Class<T> clazz)
93 try {
94 Constructor<T> c = clazz.getConstructor();
95 return c.newInstance();
96 } catch (SecurityException e) {
97 return null;
98 } catch (IllegalArgumentException e) {
99 return null;
100 } catch (NoSuchMethodException e) {
101 return null;
102 } catch (InstantiationException e) {
103 return null;
104 } catch (IllegalAccessException e) {
105 return null;
106 } catch (InvocationTargetException e) {
107 return null;