资源简介
该工具类下载后拷贝到你要用的包,只需该包名即可
代码片段和文件信息
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
- 上一篇:android5.1_root_patch
- 下一篇:android欢迎界面源码
评论
共有 条评论