每一个类都有一个class对象,.class文件保存着class对象,类加载相当于class对象的加载。
反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的 .class 不存在也可以加载进来。
Class 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect 类库主要包含了以下三个类:
• Field :可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段;
• Method :可以使用 invoke() 方法调用与 Method 对象关联的方法;
• Constructor :可以用 Constructor 的 newInstance() 创建新的对象。
反射的优点:
• 可扩展性 :应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。
• 类浏览器和可视化开发环境 :一个类浏览器需要可以枚举类的成员。可视化开发环境(如 IDE)可以从利用反射中可用的类型信息中受益,以帮助程序员编写正确的代码。
• 调试器和测试工具 : 调试器需要能够检查一个类里的私有成员。测试工具可以利用反射来自动地调用类里定义的可被发现的 API 定义,以确保一组测试中有较高的代码覆盖率。
反射的缺点:
• 性能开销大
• 必须在一个有安全限制的环境中运行
• 内部暴露:破坏抽象性、可移植性
网友评论