getMethods获取的方法中还有Object中继承的方法
程序员文章站
2022-03-02 17:29:01
碰到一个异常,先看代码:本意是利用反射获得一个类中的所有方法,然后执行此方法。 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, InterruptedException { Class>...
碰到一个异常,先看代码:
本意是利用反射获得一个类中的所有方法,然后执行此方法。
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, InterruptedException {
Class<?> c = Class.forName("com.itheima2.day14.Test02Class");
Test02Class o =(Test02Class)c.getConstructor().newInstance();
Method[] methods = c.getMethods();
for (Method method : methods) {
method.invoke(o);
}
}
public class Test02Class {
public void test01() {
System.out.println("test01");
}
public void test02() {
System.out.println("test02");
}
public void test03() {
System.out.println("test03");
}
public void test04() {
System.out.println("test04");
}
}
奈何报了异常:(神坑啊!我的天,颠覆人生观啊!)
test01
test02
test03
test04
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.itheima2.day14.Test02.main(Test02.java:17)
Caused by: java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
... 5 more
使劲往跟的异常找,奈何水平有限找不到原因:
其它帖子说这个是线程没拥有锁对象时,调用了wait()、notify().等方法,所致。
但是脑回路来了,我就换了个循环:
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, InterruptedException {
Class<?> c = Class.forName("com.itheima2.day14.Test02Class");
Test02Class o =(Test02Class)c.getConstructor().newInstance();
Method[] methods = c.getMethods();
//不使用foreach循环就没有问题,这是为啥呢?
for (int i = 0; i < 4; i++) {
methods[i].invoke(o);
}
}
解决办法:
根据其它帖子的知识我决定采用synchronized()同步代码块,锁对象是o,奈何这样也不正确。结果是:错误不报了。但是线程卡住了。
如果你也遇到这样的异常,还请大佬赐教!
然鹅,更奇怪的事情发生了,我就cao了!
这样的代码竟然不能执行:
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, InterruptedException {
Class<?> c = Class.forName("com.itheima2.day14.Test02Class");
Test02Class o =(Test02Class)c.getConstructor().newInstance();
Method[] methods = c.getMethods();
Arrays.sort(methods,(m1,m2)->m1.getName().compareTo(m2.getName()));
//
for (int i = 0; i < 4; i++) {
if (methods[i].isAnnotationPresent(MyTest02.class)) {
methods[i].invoke(o);
}
}
}
最后终于发现,我真蠢!
Method[] methods = c.getMethods(); 获取的是类中的所有方法,这里包括继承自Object,的方法,所以才有了执行wait()方法的异常。
本文地址:https://blog.csdn.net/liyuancsdn/article/details/109622850
推荐阅读
-
使用Java获取html中Select,radio多选的值方法
-
Java 获取Html文本中的img标签下src中的内容方法
-
iOS中的地理位置的获取及plist设置方法
-
Android中获取手机屏幕大小的方法
-
C#使用反射(Reflect)获取dll文件中的类型并调用方法
-
Android开发中获取View视图宽与高的常用方法小结
-
sqlserver中获取月份的天数的方法分享
-
iOS App开发中通过UIDevice类获取设备信息的方法
-
在Java代码中解析html,获取其中的值方法
-
Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法