java 反射 getclass_java 反射使用 Class.getMethod 应注意

java 反射使用 Class.getMethod 应注意  记录下

Method method= clazz.getMethod(setMethodName,propertiesClass);

如果使用该方法 会不能获取以多态方式传入的参数

会抛异常 java.lang.NoSuchMethodException

比如:

public class Student {private String name;private int age;private List list = new ArrayList();public String getName() {    return name;}public void setName(String name) {    this.name = name;}public int getAge() {    return age;}public void setAge(int age) {    this.age = age;}public List getList() {    return list;}public void setList(List list) {    this.list = list;}

}public static void main(String[] args) {    try {        Class> clazz= Class.forName(Student.class.getTypeName());        List list = new ArrayList();        clazz.getMethod("setList",list.getClass());    } catch (ClassNotFoundException | NoSuchMethodException e) {        e.printStackTrace();    }}    此时会抛异常:    java.lang.NoSuchMethodException: com.jcb.xml.model.Student.setList(java.util.ArrayList)    解决方案:    /** * 获取只有一个参数的对应方法 * @param className * @param methodName * @return */private Method getMethod(String className,String methodName,Class> propertiesClass){    Method[] methods=getMethods(className);    for (Method method : methods) {        if(method.getName().equals(methodName)){            if(method.getParameterCount() == 1){                //该函数的参数类型和传入参数类型相同                if(method.getParameterTypes()[0].getTypeName().equals(propertiesClass.getTypeName())){                    return method;                    //该函数的参数类型是传入参数类型的父类                }else if(method.getParameterTypes()[0].getTypeName().equals(propertiesClass.getSuperclass().getTypeName())){                    return method;                }else                {                    Set superClassAndSuperInterfaceList= this.getAllSuperClassAndSuperInterface(propertiesClass);                    //如果传入参数类型是参数类型的子类 也返回改函数                    if(superClassAndSuperInterfaceList.contains(method.getParameterTypes()[0].getTypeName()))                        return method;                }            }        }    }    return  null;}    /** * 获取所有父类类型和父类接口类型 * @param clazz * @return */private Set getAllSuperClassAndSuperInterface(Class> clazz){    Set superClassAndSuperInterfaceList = new HashSet<>();    getAllSupersClasss(superClassAndSuperInterfaceList,clazz);    getAllSuperInterfaces(superClassAndSuperInterfaceList,clazz);    return superClassAndSuperInterfaceList;}/** * 递归获取所父类 类型 * @param parentClassList * @param clazz */private Set getAllSupersClasss(Set parentClassList,Class> clazz){    parentClassList.add(clazz.getSuperclass().getName());    if(Object.class.getTypeName()!=clazz.getSuperclass().getTypeName()){        //父类也可能实现接口        getAllSuperInterfaces(parentClassList,clazz.getSuperclass());        //递归查询父类        getAllSupersClasss(parentClassList,clazz.getSuperclass());    }    return parentClassList;}/** * 递归获取父类接口 * @param parentInterfaceList * @param clazz */private Set getAllSuperInterfaces(Set parentInterfaceList,Class> clazz){    for (Class> aClass : clazz.getInterfaces()) {        parentInterfaceList.add(aClass.getTypeName());        //递归查询实现接口        getAllSuperInterfaces(parentInterfaceList,aClass);    }    return parentInterfaceList;}    使用该getMethod 代替反射 Class.getMethod 方法 就可以      多参数函数类似

第二种方法  更清晰  包含多参数函数

/**获取参数所对应的函数

@param className

@param argsClass

@return

*/

private Method getMethod(String className, String methodName,Class>[] argsClass){

Method[] methods=getMethods(className);

for (Method method : methods) {

if(method.getName().equals(methodName)) {

if (method.getParameterTypes().length == argsClass.length) {

if (checkArgsType(method.getParameterTypes(), argsClass)) {

return method;

}

} else {

continue;

}

}

}return null;

}

/**

@param sourceArgsClass 函数的参数类型

@param argsClass 传入函数的参数类型

@return

*/

private boolean checkArgsType(Class>[] sourceArgsClass,Class>[] argsClass){for (int i =0;i

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值