在java反射中使用Class.getMethod时,请小心记录
方法方法=clazz.get method (设置方法名称,属性类);
使用此方法时,无法获取以多态性传递的参数
投掷异常的Java.lang.nosuchmethodexception
例如:
公共类事件{
私有字符串名称;
私密int age;
私有列表列表=new ArrayList (;
公共字符串getname
返回名称;
}
公共语音集名称(字符串名称) {
this.name=name;
}
公共int get age () {
返回age;
}
公共语音设置(intage ) {
this.age=age;
}
公共列表获取列表(
返回列表;
}
公共语音集列表(列表列表) {
this.list=list;
}
}
publicstaticvoidmain (字符串[ ] args ) {
try {
class clazz=class.forname (student.class.get typename ();
列表列表=new ArrayList (;
clazz.getmethod('setlist ',list.getClass ) );
} catch (classnotfoundexception ) {
e .打印堆栈跟踪(;
}
}
这种情况下,投异常。
Java.lang.nosuchmethodexception : com.JCB.XML.model.student.set list (
解决方案:
//*
*获取仅一个参数的对应方法
* @param className
* @param methodName
* @return
*/
privatemethodgetmethod (string class name,String methodName,Class propertiesClass ) {
方法[ ]方法=get方法(class name;
方法方法:方法{
if(method.getname ().equals ) (methodname ) )。
if (method.getparameter count (==1) {
//此函数的参数类型与传递的参数类型相同
if (方法. getparameter types ((0).gettypename ).equals (属性类. gettypename ) ) ) ) )。
返回方法;
//此函数的参数类型是传递的参数类型的父类
} else if (method.getparameter types ([0].gettypename ).equals ) propertiesclass.getsuperclass ).get typename
返回方法;
}else
{
setsuperclassandsuperinterfacelist=this.getallsuperclassandsuperinterface (属性类);
//如果传递的参数类型是参数类型的子类,也返回函数
if (superclassandsuperinterfacelist.contains (method.getparameter types ([0].get typename ) ) )
返回方法;
}
}
}
}
返回空值;
}
//*
*获取所有父类类型和父类接口类型
* @param clazz
* @return
*/
私密性设置getallsuperclassandsuperinterface {
setsuperclassandsuperinterfacelist=new hashset (;
getallsupersclasss (superclassandsuperinterfacelist,clazz;
getallsuperinterfaces (superclassandsuperinterfacelist,clazz );
returnsuperclassandsuperinterfacelist;
}
//*
*递归获取父类类型
* @ param parent类列表
* @param clazz
*/
私有设置类列表,类类类ZZ {
parent class list.add (clazz.get super class ().getName ) );
if(object.class.gettypename (!=clazz.getSuperclass ().getTypeName ) ) }
//父类也可能实现接口
getallsuperinterfaces (parent class list,clazz.getSuperclass ();
//递归查询父类
getallsupersclasss (父类列表,clazz.get super类) );
}
返回父类列表;
}
//*
*递归获取父类接口
* @param parentInterfaceList
* @param clazz
*/
私有设置工具(setparentinterfacelist,Class clazz ) {
for (class aclass : clazz.get接口() ) }
parentinterfacelist.add (aclass.get typename ();
//递归查询实现接口
getallsuperinterfaces (parentinterfacelist、aClass;
}
返回参数界面列表;
}
使用该getMethod代替反射Class.getMethod方法即可
暂时想到的是这个解决方案
多参数函数相似
译文: 3358 blog.51cto.com/5013162/2141201