⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reflecthelper.java

📁 用Java实现的23个常用设计模式源代码
💻 JAVA
字号:
//$Id: ReflectHelper.java,v 1.12.2.12 2003/11/29 07:55:15 oneovthafew Exp $package net.sf.hibernate.util;import java.lang.reflect.Constructor;import java.lang.reflect.Member;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import net.sf.cglib.beans.BulkBean;import net.sf.cglib.beans.BulkBeanException;import net.sf.cglib.reflect.FastClass;import net.sf.hibernate.AssertionFailure;import net.sf.hibernate.MappingException;import net.sf.hibernate.PropertyNotFoundException;import net.sf.hibernate.property.BasicPropertyAccessor;import net.sf.hibernate.property.Getter;import net.sf.hibernate.property.PropertyAccessor;import net.sf.hibernate.type.PrimitiveType;import net.sf.hibernate.type.Type;import net.sf.hibernate.type.TypeFactory;public final class ReflectHelper {		private static final Log log = LogFactory.getLog(ReflectHelper.class);	//TODO: this dependency is kinda Bad	private static final PropertyAccessor BASIC_PROPERTY_ACCESSOR = new BasicPropertyAccessor();		private static final Class[] NO_CLASSES = new Class[0];	private static final Class[] OBJECT = new Class[] { Object.class };	private static final Method OBJECT_EQUALS;		static {		Method eq;		try {			eq = Object.class.getMethod("equals", OBJECT);		}		catch (Exception e) {			throw new AssertionFailure("Could not find Object.equals()", e);		}		OBJECT_EQUALS = eq;	}		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 Type reflectedPropertyType(Class theClass, String name) throws MappingException {		return TypeFactory.heuristicType( BASIC_PROPERTY_ACCESSOR.getGetter(theClass, name).getReturnType().getName() );	}		public static Class reflectedPropertyClass(Class theClass, String name) throws MappingException {		return BASIC_PROPERTY_ACCESSOR.getGetter(theClass, name).getReturnType();	}		public static Getter getter(Class theClass, String name) throws MappingException {		return BASIC_PROPERTY_ACCESSOR.getGetter(theClass, name);	}		public static Class classForName(String name) throws ClassNotFoundException {		try {			return Thread.currentThread().getContextClassLoader().loadClass(name);		}		catch (Exception e) {			return Class.forName(name);		}	}		public static boolean isPublic(Class clazz, Member member) {		return Modifier.isPublic( member.getModifiers() ) && Modifier.isPublic( clazz.getModifiers() );	}		public static Object getConstantValue(String name) {		Class clazz;		try {			clazz = classForName( StringHelper.qualifier(name) );		}		catch(ClassNotFoundException cnfe) {			return null;		}		try {			return clazz.getField( StringHelper.unqualify(name) ).get(null);		}		catch (Exception e) {			return null;		}	}		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 BulkBean getBulkBean(Class clazz, String[] getterNames, String[] setterNames, Class[] types) {		try {			BulkBean optimizer = BulkBean.create(clazz, getterNames, setterNames, types);			if ( !clazz.isInterface() ) {				//test out the optimizer:				Object instance = FastClass.create(clazz).newInstance();				optimizer.setPropertyValues( instance, optimizer.getPropertyValues(instance) );			}			//if working:			return optimizer;		}		catch (Throwable t) {			String message =			"reflection optimizer disabled for: " + 			clazz.getName() + 			", " + 			StringHelper.unqualify( t.getClass().getName() ) + 			": " + 			t.getMessage();			if (t instanceof BulkBeanException) {				int index = ( (BulkBeanException) t ).getIndex();				if (index >= 0) {					message += " (property " + setterNames[index] + ")";				}			}			log.info(message);			return null;		}	}		public static Constructor getConstructor(Class clazz, Type[] types) throws PropertyNotFoundException {		Constructor[] candidates = clazz.getConstructors();		for ( int i=0; i<candidates.length; i++ ) {			Class[] params = candidates[i].getParameterTypes();			if ( params.length==types.length ) {				boolean found = true;				for ( int j=0; j<params.length; j++ ) {					final boolean ok = params[j]==types[j].getReturnedClass() || (						types[j] instanceof PrimitiveType &&						params[j] == ( (PrimitiveType) types[j] ).getPrimitiveClass() 					);					if (!ok) {						found = false;						break;					}				}				if (found) return candidates[i];					}		}		throw new PropertyNotFoundException( "no appropriate constructor in class: " + clazz.getName() );	}	public static String getPropertyName(Throwable t, BulkBean optimizer) {		if (t instanceof BulkBeanException) {			return optimizer.getSetters()[ ( (BulkBeanException) t ).getIndex() ];		}		else {			return "?";		}	}	private ReflectHelper() {}		public static final String PROPERTY_ACCESS_EXCEPTION = 		"exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info)";	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -