既然Java反射可以访问和修改私有成员变量,那封装成private还有意义么?

发布于2022-01-13 19:36:09
8个回答
admin
网友回答2022-01-13

没有set方法,反射会报错。有set方法,方法里可以做一些判断防止非法值。比直接public还是要灵活一些。

admin
网友回答2022-01-13

私有公有都是上层概念,反正都是内存区域,你想要改,怎么都能改,比如在java里面通过反射,比如玩游戏用的内存修改器[捂脸]

admin
网友回答2022-01-13

C++申明为const常量,访问常量变量地址一样能修改内存数据,C++中声明为private,通过对象地址和便宜地址一样可以修改private成员。

都是编译器约定而已,java更高级,修改更方便。

admin
网友回答2022-01-13

之前修改别人的代码,但是有个pojo是依赖进来的,不能修改。只能建一个类继承它,加拓展属性。就用反射复制属性过来。

admin
网友回答2022-01-13

反射有它特定的应用场景,一般用于框架的建设比较多。像我们比较熟悉的Spring框架就用了反射技术,开发人员日常编码是比较少用反射的,再加上反射的性能不高,所以每项技术的出现都是有它特定原因的。。

admin
网友回答2022-01-13

你没发现反射访问是很费力吗?,private的意义就在于没想让人访问,而JAVA反射的开发在于实现这个功能而已,其实在开发之初也没想到你用反射只是为了访问一个私有的变量。

admin
网友回答2022-01-13

要从不同角度来看待private和反射。

private代表了封装,是面向对象的体现。而反射是java这门语言的特性之一,为了提供更加灵活和高级的操作。

所以框架一般会用到反射,用于做一些aop等。而我们的业务代码要面向对象编程,便于复用扩展维护。

换句话说,反射更加底层,底层是不需要oop的。

admin
网友回答2022-01-13

很高兴能回答你的问题:

  1. 简单来说,private并不是解决“安全”问题的。
  2. 安全是指不让代码被非法看到/访问。但是只要人能拿到代码,总会有办法去查看和改变代码。
  3. private想表达的不是“安全性”的意思,而是OOP的封装概念,是一种编译器可以帮助你的设计。这就像是一家没人的店挂了个牌子“闲人免进”,但你真要进去还是有各种办法可以办到。所以private,以及所有其他的access modifier都有一层隐含的含义:如果你按照遵守这套规则,开发者可以保证不问题(不考虑bug的情况下);否则,后果自负。
  4. 比如,你在用spring的IoC的时候,你知道你要“注入”,不管它是不是private的,你知道“注入”是你自己控制的,是你设计好的效果。那么通过spring的IoC利用反射帮你注入一些private property是再正常不过的用法。
  5. 再比如,单元测试,你就想测一个private方法。但是因为private的缘故就是测不了。于是你可以用反射绕开这个限制,开心的做测试。

总上所述,private只是个约定而已。

回到
顶部