本帖最后由 qianji20000420 于 2017-8-5 22:33 编辑
在第一篇已经讲了,Java在加载类时会创建一个与该类对应的字节码文件对象,这个对象是Class类的一个实例 先上一波API
可能大家对Class这个类不算太熟悉。但是Class这个名并不是第一次见。
这个是Object类的getClass方法 可能你并没有用到过。 但是今天反射却要用到他了
这就是我们获取class文件对象的一种方式。 当想要获取一个对象或实例或字段的class文件对象 需要用到Object类的getClass()方法 当想要获取一个类的class文件对象 使用 类名.class 来获取 Class类提供了forName方法 传入类的全路径来获取
|
|
|
这里我们先创建两个类 Demo 和 test 在test里我已经写好了无参构造 在Demo里我已经写好了主方法
接下来在主方法中获取test类的字节码文件对象 然后通过查询API得知:
这四个方法是与构造方法有关的
有没有getConstructor和getDeclaredConstructor的区别在于有Declared能获取到非公共的即无public修饰的构造方法
接下来我会使用getDeclaredConstructor() ps:反正带Declared的都能获取到 何乐而不为呢?(啪)
接下来在主方法中写上 - Constructor cs = c.getDeclaredConstructor();
复制代码getDeclaredConstructor的参数是Class类实例。也就是构造函数中参数所对应的Class对象,因为是无参的,所以这里空就可以了。 Constructor的泛型先不用管它了。
发现有异常了。 不管他先抛出 等会再讲
这样就获取到了test类的无参构造对应的Constructor对象
接下来我们要用到Constructor类下的newInstance方法 参数即为构造函数的参数
这个方法的用途和 new 的用途基本相同
也就是说在这里
cs.newInstance() 与 new test() 是等价的 - test t = (test) cs.newInstance();
复制代码之后我们将获取到的对象直接强转为test就获取到test的对象了
控制台就会输出个hi 证明我们成功通过反射成功调用了test的无参构造并实例化了对应的test对象
|
|
|
用法和无参基本相同,只需要在getDeclaredConstructor及newInstance后面的参数做变化 getDeclaredConstructor的参数是class文件对象,也就是说 他应该传入的是对于构造函数参数所对应类的对应Class对象 这里应该用String.class newInstance后面的参数即为你实例化一个对象传入构造函数中的参数 |
|
|
当我们在test类中创建一个私有的构造函数
比如
然后在主方法中 将“233”随便改成一个int类型的数 我这里比如123
并把String.class改成int.class (基本数据类型也有对应的class对象哦)
当我们运行时
怎么报错了??!
IllegalAccessException 正如名字一样 非法的访问异常
他既然是私有的,能让你轻易访问吗?
这时我们看到了--
我天,这不就容易了。 我来
所以说 , 私有的构造方法不是不能够被调用的。。 |
|
|
反射中对成员变量的调用
返回索引贴
第一次做教程,如果教程中有遗漏的或说错的地方请及时指出哇。~ |
|
|
[groupid=1181]Unknown Domain[/groupid]