我是靠谱客的博主 专一宝贝,这篇文章主要介绍利用反射机制获得非静态内部类之getConstructor的用法探索,现在分享给大家,希望可以做个参考。

 来源: http://blog.163.com/qhasilver@126/blog/static/161553399201291311119821/

提问关于反射机制拿到内部类的构造方法的问题。总结一下个人学习新东西的过程。 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

import java.lang.reflect.*; public class Test1 { public static void main(String[] args) throws Exception {   Class cls = Test1.Person.class;   System.out.println(cls);//这句话的打印说明已经拿到了内部类的字节码对象。   Constructor con = cls.getConstructor(null);   System.out.println(con.getName());   System.out.println(con.getModifiers()); } //内部类 class Person{   private String name;      public Person(){} } }  

复制代码
1
Constructor con = cls.getConstructor(null);这一行抛出java.lang.NoSuchMethodException 异常
复制代码
1
替换为Constructor con = cls.getConstructors()[0];之后,报错解决了,可究竟为什么用getConstructor就不行呢?
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
首先查API,搜索getConstructor得到的结果是
复制代码

getConstructor

复制代码
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形参类型。 如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。

要反映的构造方法是此 Class 对象所表示的类的公共构造方法,其形参类型与 parameterTypes 所指定的参数类型相匹配。


参数:
parameterTypes - 参数数组
返回:
与指定的 parameterTypes 相匹配的公共构造方法的 Constructor 对象
抛出:
NoSuchMethodException - 如果找不到匹配的方法。
SecurityException - 如果存在安全管理器 s ,并满足下列任一条件:
  • 调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝访问构造方法
  • 调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包
复制代码
意味着若是要使用getConstructors方法得到正确结果,必须传入一个参数parameterTypes。这个参数类型为Class。二话不说,指定为
复制代码
Constructor con = cls.getConstructor(Test1.Person.class);结果依旧报错。这是何故?
复制代码
只好继续看API提示,先来个输出语句,看看利用之前获得的cls.getConstructors()[0]究竟是个什么玩意儿?加上下面这条语句
复制代码
复制代码

Class[] parameterTypes = con.getParameterTypes();     for(int i = 0; i < parameterTypes.length; i++){      System.out.println(parameterTypes[i]);     }

复制代码
输出结果为:class Test1
复制代码
既然有了parameterTypes,换回原来的Constructor con = cls.getConstructor(Test1.class);完整代码如下
复制代码
复制代码

import java.lang.reflect.*;

public class Test1 {  public static void main(String[] args) throws Exception {     Class cls = Test1.Person.class;     //System.out.println(cls);//这句话的打印说明已经拿到了内部类的字节码对象。     Constructor con = cls.getConstructor(Test1.class);//传入外包装类作为参数     System.out.println(con.getName());     System.out.println(con.getModifiers());  }

 // 内部类  class Person {   private String name;     public Person(){}

 } }

复制代码
这时我们回到API文档中,注意到这么一句话:如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。 恰巧有位同学把官方英文版API也贴出来了 include the explicit enclosing instance as the first parameter
复制代码
看到这里,我们可以得到解释,为什么传入的参数不是Test1.Person.class而是Test1.class
复制代码
果然原版的API表达的意思会更饱满更易懂。这里翻译过来,应该是这个意思:非静态上下文中声明的内部类,应该把外部包装类当做第一个参数,故此应该传入Test1.class



isAssignableFrom  是否父子类

Java Package.isAnnotationPresent()方法用法实例教程。方法返回true,如果

指定类型的注释存在于此元素上, 否则返回false。这种方法的设计主要是为了方

便访问标记注释

最后

以上就是专一宝贝最近收集整理的关于利用反射机制获得非静态内部类之getConstructor的用法探索的全部内容,更多相关利用反射机制获得非静态内部类之getConstructor内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部