Java反射 Java反射? ● 回忆一下之前如何使用一个Java类? ● 已知一个类的类名、以及、类中的方法属性、构造方法等 ● 使用new关键字创建对象 ● 使用对象调用方法或属性 ● 问题: ● 如果仅仅知道一个类的类名,能否动态得到类的定义信息,包括哪些方法, 属性等? Java反射的概念和作用 ● Java反射的概念 • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个 类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个 方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为 java语言的反射机制。 ● Java反射的作用 • 动态获取类的信息。 Java反射相关API ● Java反射相关的类主要包括 • Class 类型 • Constructor 构造方法 • Method 方法 • Field 属性 • 除了Class外,其他类都位于java.lang.reflect包中 ● 可见,反射API将类的类型、方法、属性都封装成了类,其中最重要的类是 Class,可以说,反射的使用都是从Class开始。 Class类 ● 一旦class文件被加载到内存,就会为其创建一个Class对象。任何类被 使用时都会创建一个Class对象。 ● Class类是Java反射机制的基础,通过Class类,可以得到一个类的基本 信息。 获得Class的三种方法 ● 要使用Class类的方法,必须先获得该类的Class类的实例,获得Class 类实例的常用方法有如下三种 ● Object类中的getClass方法:适用于通过对象获得Class实例的情况 ● 类名.class方式:适用于通过类名获得Class实例的情况 ● Class类的静态方法 forName(String name) 获得Constructor类实例 ● Constructor实例通过Class实例获得,Class类中定义了如下方法 ● Constructor getConstructor(Class... parameterTypes) : 通过指定参数类型,返回构造方法实例。 ● ....... Constructor类 ● Constructor类可以通过getXXX方法获得构造方法的基本信息. ● getName:返回构造方法的名字 ....... 除了获得构造方法的基本信息,还可以创建实例 ● newInstance(Object... initargs) :创建实例 获得Field实例 ● 获得Field实例,都是通过Class中的方法实现 ● public Field getField(String name)通过指定Field名字,返回 Field实例. ● ........ 注意Field的访问权限 Field类的作用 ● Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也 可以对属性进行赋值. ● getName:返回属性的名字 ● set:设置属性值 获得Method实例 ● Method实例都是通过Class类的方法获得 ● Method getMethod(String name, Class... parameterTypes) : 通过指定方法名,参数类型,返回一个Method实例 ● ......... Method类的作用 ● Method类将类中的方法进行封装,可以动态获得方法的信息,例如 ● getName:获得方法名字 ● getParameterTypes:获得方法参数类型 ● 除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法 ● invoke(Object obj, Object... args) :使用obj调用该方法,参数为args 反射案例 ● 自定义java对象转json工具类 反射优缺点 ● 优点: ● 1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作 ● 2.提高代码的复用率,比如动态代理 ● 3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态 调用 ● 缺点: ● 1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低 ● 2.使用反射技术通常要在一个没有安全限制的程序运行. ● 3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象 性
java反射机制
最新推荐文章于 2024-11-12 21:14:07 发布