java中什么时候使用反射?反射是否破坏了面向对象的封装性?

1.java中什么时候使用反射?

什么是反射?

  答:.java源文件在经过编译后会生成.class的字节码文件。在运行阶段,jvm会将需要的.class文件加载到jvm内存中,并为每个.class字节码文件创建一个Class类的对象(注:Class类是专门用来描述.class字节码文件的,只能由jvm创建该类的对象)。Class类的对象包含了.class字节码文件的所有信息,所以可以通过Class类的对象获取到.class字节码文件中包含的类的信息:类的成员(方法、属性、构造器等)信息、类的签名、方法签名等等。
  基于上面所说的,java的反射就是利用Class对象在运行阶段获取任何类的各种信息,从而可以实例化对象,访问对象的方法和属性的这么一种机制。
  至于为什么叫反射(reflection)我的理解是:Class对象就像是一面镜子,通过它可以在运行阶段看到对应的类中的一切信息,从而进行操控。

什么时候使用反射?

  答:在某种业务场景下,无法在编写源代码时就确定要用哪个类的对象,需要根据用户的行为做出动态地响应。这个时候就可以考虑用反射机制在运行阶段根据用户的输入来判断到底实列化哪个类的对象,并调用该对象的方法等操作。例如:在美团点外卖后付款的界面,用户可以选择多种付款方式(微信、支付宝、银行卡等等)。假如每种支付方式都对应一个类,而在编写源代码的时候我们不能确定使用那种付款方式,为了代码的可扩展性,也不想用分支结构并为每个支付方式的类创建对象。那么,这种情况下就可以考虑用反射机制,用户点击哪个支付方式,程序就在运行阶段创建哪个支付方式类的对象完成支付。

2.反射是否破坏了面向对象的封装性?

什么是封装?

  答:程序的封装指的是利用各种权限修饰符(private、public、protected、default)来对类中的成员的访问权限加以限制,强制用户使用该类的时候必须遵守这个权限限制,只能按照类中设计的访问接口进行访问。其他部分就像是用罩子封装起来一样,用户是看不见的。
  举个现实中的例子:就像生活中的电脑一样,电脑是在工厂经过一系列组装,封装成了我们看到的样子。只给我们留下了有限的接口如:屏幕,键盘,usb接口等等,用户只能使用这些接口访问笔记本电脑里的数据,而不能直接从内存条或者硬盘上访问数据。这就是现实生活中的一种封装。

反射是否破坏了面向对象的封装性?

  答:反射并没有破坏面向对象的封装性。因为通过反射机制获取到的带权限修饰符的方法和属性都依然遵照权限修饰符限定的访问方式。
  除非调用setAccessible(true)方法来抑制java访问权限检查,从而达到可以随意访问的效果。但是利用setAccessible(true)是一种暴力方式,不安全。开发人员一般不会用这种方式损害自己代码的封装性。
  举个例子:就像现实生活中的电脑,是在工厂经过一系列组装,封装成了我们看到的样子。只给我们留下了有限的接口如:屏幕,键盘,usb接口等等,用户只能使用这些接口访问笔记本电脑里的数据,而不能直接从内存条或者硬盘上访问数据。但是,电脑维修的时候,也可以用暴力的方式拆开电脑的外壳,从而看到电脑的内部结构。
  同样的道理setAccessible(true)就是java反射中的一种最终的暴力手段,但是这并不破坏Java的封装性。就像电脑可以被暴力拆解,但是不影响电脑是一个被封装起来供用户使用的数码产品。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值