反射的基本概念

  Java   3分钟   324浏览   0评论

什么是反射

反射是⼀种能够在程序运⾏时动态访问,修改某个类中任意属性和⽅法的机制(包括private实例和⽅法)
java反射机制提供了以下⼏个功能:

  • 在运⾏时判断任意⼀个对象所属的类
  • 在运⾏时构造任意⼀个类的对象
  • 在运⾏时判断任意⼀个类所具有的成员变量和⽅法
  • 在运⾏时调⽤任意⼀个对象的⽅法

反射涉及到的四个核⼼类:

  • java.lang.Class.java:类对象;
  • java.lang.reflect.Constructor.java:类的构造器对象;
  • java.lang.reflect.Method.java:类的⽅法对象;
  • java.lang.reflect.Field.java:类的属性对象;

反射有什么用

  • 操作因访问权限限制的属性和⽅法;
  • 实现⾃定义注解;
  • 动态加载第三⽅jar包,解决android开发中⽅法数不能超过65536个的问题;
  • 按需加载类,节省编译和初始化APK的时间;

反射工作原理

当我们编写完⼀个Java项⽬之后,每个java⽂件都会被编译成⼀个.class⽂件,这些Class对象承载了这个类的所有信息,包括⽗类、接⼝、构造函数、⽅法、属性等,这些class⽂件在程序运⾏时会被ClassLoader加载到虚拟机中。
当⼀个类被加载以后,Java虚拟机就会在内存中⾃动产⽣⼀个Class对象。我们通过new的形式创建对象实际上就是通过这些Class来创建,只是这个过程对于我们是不透明的⽽已。
反射的⼯作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运⾏时动态访问和修改任何类的⾏为和状态。

反射的特点

优点

  • 灵活、自由度高: 不受类的访问权限限制,想对类做啥就做啥;

缺点

  • 性能问题: 通过反射访问、修改类的属性和⽅法时会远慢于直接操作,但性能问题的严重程度取决于在程序中是如何使⽤反射的。如果使⽤得很少,不是很频繁,性能将不会是什么问题;
  • 安全性问题: 反射可以随意访问和修改类的所有状态和⾏为,破坏了类的封装性,如果不熟悉被反射类的实现原理,随意修改可能导致潜在的逻辑问题;
  • 兼容性问题: 因为反射会涉及到直接访问类的⽅法名和实例名,不同版本的API如果有变动,反射时找不到对应的属性和⽅法时会报异常;

总结

  • 通过反射访问⽅法⽐实例慢很多;
  • 有⽤到反射的类不能被混淆;
  • 反射存在性能问题,但使⽤不频繁、按需使⽤时,对程序性能影响并不⼤;
  • 反射存在安全性问题,因为可以随意修改类的所有状态和⾏为(包括private⽅法和实例);
  • 使⽤反射访问Android的API时需要注意因为不同API版本导致的兼容性问题;
如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  0 条评论