Java反射( Reflection )是Java非常重要的动态特性,通过使用反射我们不仅可以获取到任何类的
成员方法( Methods)、成员变量( Fields )、构造方法( Constructors )等信息,还可以动态
创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。Java反射机制是Java语言的动态性的重要体现,也是Java的各种框架底层实现的灵魂。
• 类的对象:基于某个类 new 出来的对象,也称为实例对象。
• 类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、
属性、方法、构造方法)
• 通过类的对象,获取类对象
• Student s = new Student();
• Class c = s.getClass();
• 通过类名获取类对象
• Class c = 类名.class;(不算反射)
• 通过静态方法获取类对象
• Class c=Class.forName(“包名.类名”);
依靠java.lang.Runtime中的exec方法命令执行。
代码展示:
package com.rayxxx;
import java.lang.reflect.Method;
public class ceshi {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("java.lang.Runtime");
Method execMethod = clazz.getMethod("exec", String.class);
Method getRuntimeMethod = clazz.getMethod("getRuntime");
Object runtime = getRuntimeMethod.invoke(clazz);
execMethod.invoke(runtime, "calc.exe");
}
}
代码分析:
1.Class clazz = Class.forName("java.lang.Runtime");// 获取Runtime类对象
2.Method execMethod = clazz.getMethod("exec", String.class);//获取 Runtime.exec方法
3.Method getRuntimeMethod = clazz.getMethod("getRuntime");//获取 Runtime.getRuntime方法
4.Object runtime = getRuntimeMethod.invoke(clazz);//invoke执行getRuntime方法
4.反射调用类方法获取当前类所有的成员方法:
Method[] methods = clazz.getDeclaredMethods()
获取当前类指定的成员方法:
Method method = clazz.getDeclaredMethod("方法名");
Method method = clazz.getDeclaredMethod("方法名", 参数类型如String.class,多个参数用","号隔开);
反射调用方法
获取到java.lang.reflect.Method
对象以后我们可以通过Method
的invoke
方法来调用类方法。
调用类方法代码片段:
method.invoke(方法实例对象, 方法参数值,多个参数值用","隔开);
5.反射调用成员变量
获取当前类的所有成员变量:
Field fields = clazz.getDeclaredFields();
获取当前类指定的成员变量:
Field field = clazz.getDeclaredField("变量名");
getField
和getDeclaredField
的区别同getMethod
和getDeclaredMethod
。
获取成员变量值:
Object obj = field.get(类实例对象);
修改成员变量值:
field.set(类实例对象, 修改后的值);
6.总结常用方法
• public String getName()
• public Package getPackage()
• public Class getSuperclass()**
**• public Class[] getInterfaces()
• public Field[] getFields()
• public Method[] getMethods()
• public Constructor<?>[] getConstructors()
• public T newInstance()