首页 > 编程知识 正文

java反射的作用,class类详解

时间:2023-05-04 17:02:43 阅读:25663 作者:3322

在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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。