• 大小: 7KB
    文件类型: .java
    金币: 1
    下载: 0 次
    发布日期: 2021-05-14
  • 语言: Java
  • 标签:

资源简介

该工具类下载后拷贝到你要用的包,只需该包名即可

资源截图

代码片段和文件信息

package cn.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;


/**
 * 封装了反射的基础方法
 * object invoke(object obj String methodName object... args) 执行指定类的某个方法方法
 * object invoke(String className String methodNameobject... args) 
 * Method getMethod(Class cla String methodNameClass... parametersType) 获取指定的方法(包括父类方法)
 * object getFieldValue(object obj String fieldName) 获取字段值
 * Field getField(Class cla String fieldName) 获取指定字段
 * void setFieldValue(object obj String fieldNameobject val) 设置指定字段值
 * void setFieldValue(String classNameString fieldNameobject val)
 * Class getGenericSuperClass(Class className int index ) 获取泛型类的参数类型  index索引是从0开始的
 * 
 *  由于刚刚把java反射学了,此工具作为练习写的,有很多不足还望指教,本人qq邮箱834259846@qq.com
 * 
 * @author dp
 *
 */
public class ReflectionUtils {

/**
 * 通过反射来执行指定的方法(该方法可能是父类中的,也可能当前类私有的,但不能得到父类中私有的)
 * 
 * @param obj
 *            传入要执行方法对应的对象
 * @param methodName
 *            要执行的方法名
 * @param args
 *            执行方法的参数
 * @return
 */
@SuppressWarnings(“rawtypes“)
public static object invoke(object obj String methodName object... args){
// Class类型的数组存储参数对应的.class类型
Class[] parametersType = new Class[args.length];
for (int i = 0; i < args.length; i++) {
parametersType[i] = args[i].getClass();
}

Method method = getMethod(obj.getClass() methodName parametersType);

try {
return method.invoke(obj args);
} catch (IllegalAccessException e) {
System.out.println(“父类中的私有方法,你不可访问!!!“);
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

return null;
}

/**
 * 获取指定的方法(可能在父类中) 从当前类找指定要的方法,若没有则循环向继承的父类查找,一旦找到便返回
 * 只有传入的当前类才可看见私有的,父类中的则不可以
 * 
 * @param cla
 *            类
 * @param methodName
 *            方法名
 * @param parametersType
 *            参数类型
 * @return
 */
public static Method getMethod(Class cla String methodName
Class... parametersType) {
boolean isFirstClass = true;
for (; cla != object.class; cla = cla.getSuperclass()) {
Method method = null;
try {
method = cla.getDeclaredMethod(methodName parametersType);
if(isFirstClass){
//父类的私有方法是不能获取的
method.setAccessible(true);
isFirstClass = false;
}
return method;
} catch (Exception e) {
// 当没找到对应的方法时报的异常不做处理,让其进行下一次循环,查找继承的父类是否有该方法
}finally{
//当传进来的第一个类抛了异常,那么之后获取的都是父类,所有让前面的if条件不能执行
isFirstClass = false;
}
}

return null;
}

/**
 * 重载上面的invoke方法,通过传入的类名执行指定的方法
 * 
 * @param className
 *            通过传入的类名
 * @param methodname
 *            方法名
 * @param args
 *            方法入口参数
 * @return
 */
public static object invoke(String className Strin

评论

共有 条评论

相关资源