反射应用(二)
紧接着我们学习了反射应用如何去反射类中的方法在里面的代码:
1. 错误: java.lang.InstantiationException: com.csdn.java02.Student
2. at java.lang.Class.newInstance0(Class.java:340)
3. at java.lang.Class.newInstance(Class.java:308)
4. at com.csdn.java02.Work.test1(Work.java:24)
5. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
6. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
7. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
8. at java.lang.reflect.Method.invoke(Method.java:597)
9. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
10. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
11. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
12. at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
13. at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
14. at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
15. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
16. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
17. at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
18. at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
19. at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
20. at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
21. at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
22. at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
23. at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
24. at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
25. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
26. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
27. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
28. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
29. 错误解析:在使用class的newInstance()方法的时候必须确保Student类中有一个无参数的构造器
30. 加载类中的方法如何用反射输出:
31. ① 解析 如何获取类中所有方法
32. @Test
33. public void test()throws Exception{
34. //1加载类
35. Class cls = Class.forName("cn.csdn.reflect.Student");
36. /*//2、解析构造器
37. Constructor csr = cls.getConstructor(null);
38. //3、创建类的实例
39. Student entity = (Student)csr.newInstance(null);*/
40. Student entity = (Student)cls.newInstance();
41. Method mds[] = cls.getMethods();
42. for(Method m:mds){
43. System.out.println(m.toGenericString());
44. }
45. }
46. ② 解析:public void study()方法
47. @Test
48. public void test1()throws Exception{
49. //1加载类
50. Class cls = Class.forName("cn.csdn.reflect.Student");
51. Student entity = (Student)cls.newInstance();
52. //2解析方法
53. Method md = cls.getMethod("study", null);
54. //3、执行
55. Object obj = md.invoke(entity, null);//当没有返回值的时候 ,返回的是null
56. System.out.println(obj);
57. /*Student st = new Student();
58. st.study();*/
59. }
60. ③解析 public int getSum(int a,int b)方法
61. @Test
62. public void test2()throws Exception{
63. //1.加载类
64. Class cls = Class.forName("cn.csdn.reflect.Student");
65. Student entity =(Student)cls.newInstance();
66. //解析方法
67. Method md = cls.getMethod("getSum", int.class,int.class);
68. //执行
69. Object obj = md.invoke(entity, 12,12);
70. System.out.println((Integer)obj);
71. }
72. ④解析 类中的主方法 public static void main(String[] args)
73. @Test
74. public void test3()throws Exception{
75. Class cls=Class.forName("com.csdn.java02.Student");
76. Student student=(Student)cls.newInstance();
77. Method md=cls.getMethod("main",String[].class);
78. String str[]={"111","123"};
79. Object obj=md.invoke(student,(Object)str);
80. System.out.println(obj);
81. }