1.Java反射机制 下载本文

内容发布更新时间 : 2024/4/30 22:00:50星期一 下面是文章的全部内容请认真阅读。

反射

一、什么是反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方 法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态 调用对象方法的功能称为java语言的反射机制。

二、面向对象扩展

前面讲的面向对象的概念中有类和对象的概念。类是用来描述对象的,对象是类的实例。 类描述的是其对象所共有的属性和方法。

根据面向对象的核心思想,Java将一切都看做是对象(everything is an object) 那么,类是不是也可以看做是一种对象?这种对象由谁来描述?这种对象共有的属性和 方法是什么?

三、实现反射的核心类和对象

Java API中的Class类是用来实现反射的最重要的功能类。 类的字节码文件(*.class)是实现反射的核心对象。

Class就是用来描述所有的字节码文件,将字节码文件当做是对象。通过操作字节码文 件对象来获得该类中的属性、方法、构造等信息。

四、Java反射的功能

在运行中动态获取对象及其类的信息。 --可以获取正在运行中的类的属性信息。 --可以获取正在运行中的类的方法信息。 --可以获取正在运行中的类的构造信息。 --可以获取正在运行中的类的访问修饰符。

五、实现反射的一些类

java.lang.Class 该类的对象为一份字节码文件(.class) java.lang.reflect.Field 该类描述相关类的属性信息 java.lang.reflect.Method 该类描述相关类的方法信息 java.lang.reflect.Constructor 该类描述相关类的构造器信息

java.lang.reflect.Modifier 该类描述相关类的访问修饰符信息

六、三种获取字节码对象的方式

1. 对象名.getClass()

2. Class.forName(类全限定名字符串) 3. 类型名.class

七、获取类信息的方法

1. 获取类的构造器 Class类的方法:

getConstructor(Class... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。

getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

getDeclaredConstructor(Class... parameterTypes) 返回一个 Constructor 对象,该 对象反映此 Class 对象所表示的类或接口的指定构造方法。

getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 Constructor类的方法:

setAccessible(boolean flag) 将此对象的 accessible 标志设置为指示的布尔值。 可以改变该对象的访问权限。

newInstance(Object... initargs) 使用此 Constructor 对象表示的构造方法来创建该 构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。 2. 获取访问修饰符 Class类的方法:

getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。 Modifier类的方法:

toString(int mod) 返回描述指定修饰符中的访问修饰符标志的字符串。 isXXXXX(int mod) 如果整数参数包括XXXXX修饰符,则返回 true,否则返回 false。

3. 获取类的属性 Class类的方法:

getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接 口的指定公共成员字段。

getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所 表示的类或接口的所有可访问公共字段。

getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所 表示的类或接口的指定已声明字段。

getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表 示的类或接口所声明的所有字段。 Field类的方法:

setAccessible(boolean flag) 将此对象的 accessible 标志设置为指示的布尔值。 可以改变该对象的访问权限。

getXXXX(Object o) 获取参数对象中XXXX类型或另一个通过扩展转换可以转换为 XXXX类型的基本类型的静态或实例字段的值。

setXXXX(Object o, XXXX x) 将字段的值设置为指定对象上的一个XXXX型的值。 4. 获取类的方法 Class类的方法:

getMethod(String name, Class... parameterTypes) 返回一个 Method 对象,它反 映此 Class 对象所表示的类或接口的指定公共成员方法。

getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对 象所表示的类或接口(包括那些由该类或接口声明的以及从超类 和超接口继承的那些的类或接口)的公共成员方法。

getDeclaredMethod(String name, Class... parameterTypes) 返回一个 Method 对 象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。

getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对

象表示的类或接口声明的所有方法,包括公共、保护、默认 (包)访问和私有方法,但不包括继承的方法。 Method类的方法:

setAccessible(boolean flag) 将此对象的 accessible 标志设置为指示的布尔值。 可以改变该对象的访问权限。

getParameterTypes() 按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。

getReturnType() 返回一个 Class 对象,该对象描述了此 Method 对象所表示的方 法的正式返回类型。

invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对 象表示的底层方法。

面试常见问题:

1. 简单描述Java的反射机制

2. 在哪些场景经常运用Java的反射机制 3. 反射机制的优缺点