接口优于反射机制(53)

核心反射机制(java.lang.reflect)

  • 提供了通过程序访问已装载类信息的途径
  • 给定一个Class实例,访问Constructor(构造器)、Method(方法)、Filed(域)

Constructor(构造器)、Method(方法)、Filed(域)实例使得你可以通过反射操作其底层对等体

  • 通过调用底层类的实例上的方法,可以构造底层类实例、调用底层类的方法、访问底层类的域
    • 例如Method.invoke 允许你调用任何对象的任何方法  
  • 反射机制允许一个类调用另一个类,即使前者被编译的时候,后者还不存在

反射需要付出代价

  • 丧失了编译时类型检查的好处,包括异常检查
    • 如果程序企图用反射调用不存在的类或方法,运行时会报错
  • 执行反射访问所用到的代码笨拙、冗长
    • 编写起来乏味、阅读起来困难
  • 性能损失
    • 反射方法调用比普通方法慢很多,亲测2倍~50倍不等

反射功能只能在设计时被用到

  • 普通应用程序通常应该以正常方式访问到对象,而不是以反射

一些复杂应用程序需要以反射方式访问应用程序

  • 比如类浏览器、对象监视器、代码分析器、解释型内嵌式系统
  • 在RPC(远程调用)时,使用反射机制也很合适,这样不用存根编译器

如下,创建了一个Set<String>

  • 传入参数是 java.util.HashSet、java.util.TreeSet
  • 稍加修改可编程可编程通用的集合测试器、或通用的集合性能分析工具

3d8b7471b1d0abca9bf55474c69478c2b23.jpg

上述实例演示反射机制俩缺点:

  1. 可能产生运行时错误,如果不用反射就是编译时错误
  2. 反射生成实例,代码冗长

System.exit(1)

  • 程序中很少点用这个方法,会终止jvm

类对于运行时可能不存在的其他类、方法或者域的属性,使用反射进行管理是合理的,但是很少用

如果要编写一个包,需要依赖其他包的不同版本,使用反射就非常有用

  • 这种方式允许使用最小环境进行编译,然后使用反射访问其他更新版本内容

反射机制是功能非常强大的机制

  • 如果编写的程序必须与编译时未知的类一起工作,请仅仅使用反射创建新实例
  • 使用实例的接口或者超类进行方法或域的访问

转载于:https://my.oschina.net/u/3847203/blog/1927225

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值