package com.songbx; import java.lang.reflect.Constructor; import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.hibernate.AssertionFailure; import org.hibernate.PropertyNotFoundException; import org.hibernate.type.PrimitiveType; import org.hibernate.type.Type; public class ReflectHelper { private static final Class[] NO_CLASSES = new Class[0]; private static final Class[] OBJECT = new Class[] { Object.class }; private static final Method OBJECT_EQUALS; private static final Class[] NO_PARAM = new Class[] { }; private static final Method OBJECT_HASHCODE; static { Method eq; Method hash; try { eq = Object.class.getMethod("equals", OBJECT); hash = Object.class.getMethod("hashCode", NO_PARAM); } catch (Exception e) { throw new AssertionFailure("Could not find Object.equals() or Object.hashCode()", e); } OBJECT_EQUALS = eq; OBJECT_HASHCODE = hash; } //是否覆盖了equals方法 public static boolean overridesEquals(Class clazz) { Method equals; try { equals = clazz.getMethod("equals", OBJECT); } catch (NoSuchMethodException nsme) { return false; //its an interface so we can't really tell anything... } return !OBJECT_EQUALS.equals(equals); } public static boolean overridesHashCode(Class clazz) { Method hashCode; try { hashCode = clazz.getMethod("hashCode", NO_PARAM); } catch (NoSuchMethodException nsme) { return false; //its an interface so we can't really tell anything... } return !OBJECT_HASHCODE.equals(hashCode); } public static Class classForName(String name) throws ClassNotFoundException { try { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if ( contextClassLoader != null ) { return contextClassLoader.loadClass(name); } } catch ( Throwable t ) { } return Class.forName( name ); } public static Class classForName(String name, Class caller) throws ClassNotFoundException { try { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if ( contextClassLoader != null ) { return contextClassLoader.loadClass( name ); } } catch ( Throwable e ) { } //使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。 return Class.forName( name, true, caller.getClassLoader() ); } //getModifiers()作为整数返回由此 Member 所表示的成员或构造方法的 Java 语言修饰符。 //isPublic() 如果整数参数包括 public 修饰符,则返回 true,否则返回 false。 public static boolean isPublic(Class clazz, Member member) { return Modifier.isPublic( member.getModifiers() ) && Modifier.isPublic( clazz.getModifiers() ); } public static Constructor getDefaultConstructor(Class clazz) throws PropertyNotFoundException { if ( isAbstractClass(clazz) ) return null; try { Constructor constructor = clazz.getDeclaredConstructor(NO_CLASSES); if ( !isPublic(clazz, constructor) ) { constructor.setAccessible(true); } return constructor; } catch (NoSuchMethodException nme) { throw new PropertyNotFoundException( "Object class " + clazz.getName() + " must declare a default (no-argument) constructor" ); } } public static boolean isAbstractClass(Class clazz) { int modifier = clazz.getModifiers(); return Modifier.isAbstract(modifier) || Modifier.isInterface(modifier); } public static boolean isFinalClass(Class clazz) { return Modifier.isFinal( clazz.getModifiers() ); } public static Constructor getConstructor(Class clazz, Type[] types) throws PropertyNotFoundException { final Constructor[] candidates = clazz.getConstructors(); for ( int i=0; i<candidates.length; i++ ) { final Constructor constructor = candidates[i]; final Class[] params = constructor.getParameterTypes(); if ( params.length==types.length ) { boolean found = true; for ( int j=0; j<params.length; j++ ) { //isAssignableFrom(Class<?> cls) //判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。 final boolean ok = params[j].isAssignableFrom( types[j].getReturnedClass() ) || ( //TODO 没看懂 types[j] instanceof PrimitiveType && params[j] == ( (PrimitiveType) types[j] ).getPrimitiveClass() ); if (!ok) { found = false; break; } } if (found) { if ( !isPublic(clazz, constructor) ) constructor.setAccessible(true); return constructor; } } } throw new PropertyNotFoundException( "no appropriate constructor in class: " + clazz.getName() ); } public static Method getMethod(Class clazz, Method method) { try { return clazz.getMethod( method.getName(), method.getParameterTypes() ); } catch (Exception e) { return null; } } }