私人网站设计公司公司,wordpress 图文直播插件,深圳网站建设raygf,有wordpress一.定义
Java的反射机制是在运行状态中的#xff0c;对于任意一个类都能知道这个类的所有属性和方法#xff1b;对于任意一个对象#xff0c;都能够调用它的任意方法及属性。既然能拿到#xff0c;我们就可以修改部分类型信息。这种动态获取信息以及动态调用对象方法的功能…一.定义
Java的反射机制是在运行状态中的对于任意一个类都能知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意方法及属性。既然能拿到我们就可以修改部分类型信息。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射reflection机制。
二.反射基本信息 Java 程序中许多对象在运行时会出现两种类型 运行时类型 (RTTI) 和编译时类型 例如 Person p new Student()这句代码中 p 在编译时类型为 Person 运行时类型为 Student 。程序需要在运行时发现对象和类的真实信息。而通过使用反射程序就能判断出该对象和类属于哪些类。 三.与反射相关的类
Class类代表类的实体在运行的Java应用程序中表示类和接口就是说比如在程序中创建了一个Person类那么就有一个Class对象里面存放Person类的相关内容
Field类代表类的成员变量/类的属性
Method类代表类的方法
Constructor类代表类的构造方法
四.Class类
Class类是反射机制的起源Java文件被编译后生成了.class文件JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为一个对象这个对象就是 java.lang.Class .这样当程序在运行时每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反射机制应用到这个实例就可以去获得甚至去添加改变这个类的属性和动作使得这个类成为一个动态的类 .
1.获得Class对象的三种方法
1.使用Class.forName(“类的全路径名”。注意这里是类的全路径如果有包需要加上包的路径 返回值是Class?类型它会抛出受查异常所以要用trycatch或者用throws。Class后面不加?也可以如下 2.使用类对象的getClass方法 3.使用类名.class方法。 这种方法最为安全可靠程序性能更高。这也说明任何一个类都有一个隐含的静态成员变量class因为使用对象的实例无法点出class
2.一个类在JVM中只会有一个Class实例
所以有如下代码 五.反射的具体使用
通过反射可以调用或修改任何权限的成员变量及方法包括private权限的
1.通过反射创建对象
用到了newInstance方法源码如下 注意该方法会抛出受查异常所以要try catch代码如下 但还是报错为什么因为该方法的返回值是泛型类由擦除机制变成Object类然后要将它给到一个Student引用就相当于是向下转型所以要用强制类型转换如下 2.调用构造方法
首先是getConstructor方法可用于调用公有的构造方法即调用public修饰的方法getDeclaredConstructor是用于调用私有的构造方法即调用private修饰的方法。
如何调用以下这个私有的构造方法 先看源码 该方法的参数是构造方法的参数类型返回值是ConstructorT,如下使用 首先要产生一个Constructor对象然后通过Constructor中的newInstance方法来实例化对象但运行时报错啦原因是Java中为例保证安全性在调用private修饰的方法前要将许可设置为true即调用setAccessible方法设置为true如下 所以从某种程度上来说反射打破了Java的封装机制本来private修饰的方法竟然可以在类外被调用
3.反射私有属性
getField是获得某个公有的属性对象,即只能获得由public修饰的属性
getDeclaredField是获得某个属性对象可以是任何权限的包括private修饰的代码如下 如果要对得到的属性进行修改就必须加上被注释掉的那句代码 表示把s1这个对象的年龄修改为13.
4.调用私有方法 getMethod是获得被public修饰的方法 getDeclaredMethod是获得任何权限的方法包括私有的 如何调用如下私有方法 代码如下 getDeclaredMethod的参数是方法名称和方法参数类型 然后要用invoke方法来调用该方法传入具体对象和参数