当前位置: 首页 > 科技观察

80%的Java程序员都不知道反射强行调用私有构造函数

时间:2023-03-12 00:52:46 科技观察

我在之前的文章中提到过一点:“可能有人会用反射强行调用我们的私有构造函数”,很多童鞋不明白Java是如何实现的反射机制可以调用私有构造函数。今天我们来做一个实验。实验代码importjava.lang.reflect.*;publicclassReflectTest{publicstaticvoidmain(String[]args)throwsException{//getConstructorClassclazz=Class.forName("TestOne");Constructorcons=clazz.getDeclaredConstructor(null);//setaccessibletoaccessprivateconstructorcons.setAccessible();//1cons.newInstance(null);cons.newInstance(null);}}classTestOne{privateTestOne(){System.out.println("initTestOne="+this.hashCode());}}实验结果注释位置1的代码cons.setAccessible(true)执行main函数,出现异常Exceptioninthread"main"java.lang.IllegalAccessException:ClassReflectTestcannotaccessamemberofclassTestOnewithmodifiers"private"在位置1打开代码cons.setAccessible(true),执行main函数,一个异常发生正常初始化信息如下:initTestOne==12677476initTestOne==33263331这说明私有构造函数被多次成功调用,注意私有构造函数。实验总结导致两次完全不同的测试结果的原因是什么?我们来分析一下cons.setAccessible(true)函数。为什么私有构造函数在设置为true时可以通过反射调用?我们定位cons.setAccessible(true)源码,可以看到下面的英文说明,右边已经帮你翻译了。也就是说,Java的反射机制非常强大,可以根据需要绕过Java语言的访问检查。原文是这样说的:Settheaccessibleflagforthisobjecttotheindicatedbooleanvalue。true值表示反射对象在使用时应禁止Java语言访问检查。false值表示反射对象应强制执行Java语言访问检查。翻译是这样的:将此对象的accessible标志设置为指定的布尔值。true的值指示反射对象在使用时应抑制Java语言访问检查。false值表示反射对象应强制执行Java语言访问检查。【本文为专栏作者“朱国立”原创稿件,转载请通过作者微信公众号“开发者圆桌”联系授权】点此查看本作者更多好文