「反射破坏java」反射破坏私有
今天给各位分享反射破坏java的知识,其中也会对反射破坏私有进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java反射机制可以调用到私有方法,是不是就破坏了JAVA的卦装性呢。
这是一个很值得探讨的问题,许多人接触反射时,对反射功能之强大都会抱有怀疑,感觉严重破坏了封装的性质。可是,什么是封装,什么是安全呢?
封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。
所谓安全,如果意思是保护实现源码不被别人看见,那没有作用。不用反射也能轻易获取源码。
所以我以为反射机制只是提供了一种强大的功能,使得开发者能在封装之外,按照特定的需要实现一些功能。就好比核技术,虽然造核弹很危险吧,但造核电站还是很有用处的(这个比喻似乎不是很恰当,将就将就)。
曾经给朋友讨论过这个问题,感觉解释得不是很清楚,大家一起探讨探讨,看看怎样表述才能更容易理解:)
反射的破坏性
参考:
基于单例模式,有很多实现方法,如:饿汉,懒汉。但是大多只会考虑到单实例和线程安全的问题,很少会考虑到反射对其的破坏。
由于反射这种Bug一样的存在,可以在系统任意地方实例化出一个对象。
反射可以直接调用构造函数,哪怕是私有的。
参考:
序列化破坏就三个步骤:
1.获得单例对象
2.对象写进文件
3.文件流反序列化为对象(实际上利用了字节码Class)
1我们阻止不了,2我们也阻止不了,只能寄希望于3。
目前来讲,从单例可靠性来说,比较好的方法是:
大家一致会以为,private是私有不允许访问的,但是在反射看来都不是事。
上述的话未经过验证,但是哪怕是有设置,依然可以通过启动java的参数去做更改,如:java -jar xxx.jar -Dspring.server.port:8888。只要是参数,都没有命令行的级别高,因此只要有人有权限,根本没办法从根本上防止反射调用私有方法。
说了那么多防止!防止!防止!
其实为什么要防止,安全性?
同为开发,真要破坏根本防不了,还需要那么曲折吗?
实际上的安全性,指的是对外,比如hash攻击,密钥被破解这些。
反射的创建不是让你去各种各样的防止这个那个。
更多的是提供了一种可能:
反射技术是不是破坏了java的封装性
没有,纯属误解
封装是静态的,反射是动态的
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
java反射机是否制扩大了访问范围,破坏了安全性?
你说的是对的,反射机制可以访问和修改私有成员,也可以调用私有方法。
反射破坏java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于反射破坏私有、反射破坏java的信息别忘了在本站进行查找喔。