java反射 reflecthelper_ReflectHelper 反射(Method,Class的应用一)

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

final Constructor constructor = candidates[i];

final Class[] params = constructor.getParameterTypes();

if ( params.length==types.length ) {

boolean found = true;

for ( int j=0; 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;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值