Java反射中,怎样判断一个方法是否存在?
如题,反射机制中有没有一个方法可以判断一个类中的方法是否存在?另外,如果一个方法不存在,如Methodmtd=Person.class().getMethod("setN...
如题,反射机制中有没有一个方法可以判断一个类中的方法是否存在?
另外,如果一个方法不存在,如
Method mtd = Person.class().getMethod("setName" ,String.class);
不存在,是直接抛出异常还是说mtd的值为null? 展开
另外,如果一个方法不存在,如
Method mtd = Person.class().getMethod("setName" ,String.class);
不存在,是直接抛出异常还是说mtd的值为null? 展开
3个回答
展开全部
抛异常。查查Class的API就知道了。API如下:
getMethod
public Method getMethod(String name,
Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
返回一个 Method 对象,它反映此 Class
对象所表示的类或接口的指定公共成员方法。name 参数是一个
String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的
Class 对象的一个数组。如果 parameterTypes 为
null,则按空数组处理。
如果 name 是 "<init>;" 或
"<clinit>",则将引发
NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):
在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
在 C
类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形参类型,则它就是反映的方法。如果在 C
中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。
注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java
虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige
method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。
请参阅Java 语言规范 第 8.2 和 8.4 节。
参数:
name - 方法名
parameterTypes - 参数列表
返回:
与指定的 name 和 parameterTypes 匹配的 Method
对象
抛出:
NoSuchMethodException
- 如果找不到匹配的方法,或者方法名为 "<init>" 或 "<clinit>"
NullPointerException
- 如果 name 为 null
SecurityException -
如果存在安全管理器 s,并满足下列任一条件:
调用 s.checkMemberAccess(this,
Member.PUBLIC) 拒绝访问方法
调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess()
的调用拒绝访问该类的包
从以下版本开始:
JDK1.1
亲自试验也是抛出异常。说为null的全是想当然的答案。
getMethod
public Method getMethod(String name,
Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
返回一个 Method 对象,它反映此 Class
对象所表示的类或接口的指定公共成员方法。name 参数是一个
String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的
Class 对象的一个数组。如果 parameterTypes 为
null,则按空数组处理。
如果 name 是 "<init>;" 或
"<clinit>",则将引发
NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):
在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
在 C
类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形参类型,则它就是反映的方法。如果在 C
中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。
注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java
虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige
method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。
请参阅Java 语言规范 第 8.2 和 8.4 节。
参数:
name - 方法名
parameterTypes - 参数列表
返回:
与指定的 name 和 parameterTypes 匹配的 Method
对象
抛出:
NoSuchMethodException
- 如果找不到匹配的方法,或者方法名为 "<init>" 或 "<clinit>"
NullPointerException
- 如果 name 为 null
SecurityException -
如果存在安全管理器 s,并满足下列任一条件:
调用 s.checkMemberAccess(this,
Member.PUBLIC) 拒绝访问方法
调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess()
的调用拒绝访问该类的包
从以下版本开始:
JDK1.1
亲自试验也是抛出异常。说为null的全是想当然的答案。
追问
我试了下,确实抛出异常了。
那第一个问题有没有答案呢?有没有办法判断一个方法是否存在?
追答
这种问题你查一下API就OK了。
API里没有判断方法是否存在的方法,那你就用异常判断,专门抓NoSuchMethodException ,一旦出现这个异常了就说明方法不存在。在对应的catch代码块里处理就行。
学编程不要太死板了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询