本文最后更新于 408 天前,其中的信息可能已经有所发展或是发生改变。
java反射机制
反射机制允许程序在运行期借助于
Reflection API
取得任何类的内部信息,并能直接操作任意类和对象的所有属性及方法。
要使用一个类,就要先把它加载到虚拟机中,在加载完类之后,堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构,这个对象就像一面镜子,透过镜子可以看到类的结构,所以形象的称之为:反射。
反射中会经常使用到的方法:
代码语言:javascript复制1、获取Class实例的方式
方式1:调用运行时类的属性 .class
方式2:通过运行时的对象调用getClass()
方式3:调用Class的静态方法:forName(String classPath)
方式4:使用类的加载器 classloader
2、创建运行时类的对象
newInstance() 调用此方法,创建对应的运行时类的对象
3、获取运行时类的结构
getFields() 获取当前运行时类及其父类中声明为public访问权限的属性
getDeclaredFields() 获取当前运行时类中声明的所有属性,不包含父类
getMethods() 获取当前运行时类及其所有父类声明为public的方法
getDeclaredMethods() 获取当前运行时类中声明的方法,不包含父类
getConstructors() 获取当前运行时类声明为public的构造器
getDeclaredConstructors() 获取当前运行时类中声明的所有构造器
invoke()方法允许调用包装在当前Method对象中的方法
反射示例:
如下代码中,Object i = m1.invoke(r1, 1, 2)
的作用是:使用r1
调用m1
获得的对象所声明的公开方法即print
,并将int
类型的1,2作为参数传入。
import java.lang.reflect.Method;
public class test {
public static void main(String[] args) {
Reflect r1=new Reflect();
//通过运行时的对象调用getClass();
Class c=r1.getClass();
try {
//getMethod(方法名,参数类型)
//getMethod第一个参数是方法名,第二个参数是该方法的参数类型
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
Method m1 = c.getMethod("print", int.class, int.class);
//相当于r1.print(1, 2);方法的反射操作是用m1对象来进行方法调用 和r1.print调用的效果完全相同
//使用r1调用m1获得的对象所声明的公开方法即print,并将int类型的1,2作为参数传入
Object i = m1.invoke(r1, 1, 2);
}catch (Exception e){
e.printStackTrace();
}
}
}
class Reflect{
public void print(int a,int b){
System.out.println(a b);
}
}
浏览量: 45