JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
package mypakage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Admin {
private String id = "";
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public void println(String para1,String para2){
System.out.println("para1=" + para1 + "/npara2=" + para2);
}
public void println(String para){
System.out.println("para=" + para);
}
public static void stestMethod(){
System.out.println("testMethod");
}
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, SecurityException,
NoSuchMethodException, IllegalArgumentException,
InvocationTargetException {
String str = "mypakage.Admin";
Class c = Class.forName(str);
Admin obj = (Admin)c.newInstance();
//取到类中相应的方法
Method m = c.getMethod("println", new Class[]{
Class.forName("java.lang.String"),int.class});
Method m1 = c.getMethod("setId", new Class[]{Class.forName("java.lang.String")});
Method m2 = c.getMethod("getId", null);
Method m3 = c.getMethod("testMethod", null);
//执行对象中相应的方法
m.invoke(obj, new Object[]{"admin",1});
m1.invoke(obj, new String[]{"124567890"});
java.lang.Object ob = m2.invoke(obj, null);
m3.invoke(null, null);
m3.invoke(obj,null);
//输出属性的值
System.out.println(ob.toString());
}
}
getMethod(String name, Class... parameterTypes);
返回Class 对象所表示的类或接口的指定公共成员方法。第一外参数name表示Class对象中的方法名称;parameterTypes 表示方法的参数,它是一个Class对象的数组,数组中的元素为方法中的对象参数,例如:
Method m = c.getMethod("println",
new Class[]{Class.forName("java.lang.String"),
int.class});
执行该语句后获得Admin对象中的println方法,对应参数是两个String类型的方法。因此它取到的是println(String para1,String para2)而不是println(String para)方法。且对于基本的 Java 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 void
也表示为 Class
对象,即通过int.class这种形式来表示为Classs对象。
Method m2 = c.getMethod("getId", null);
Method m3 = c.getMethod("testMethod", null);
当第二个参数为空时表示指定方法的没有任何参数。
invoke(Object obj, Object... args);
调用指定对象由此 Method 对象表示的基础方法。第一个参数为类对象,第二个参数为调用该方法传入的参数值,例如:
m.invoke(obj, new Object[]{"admin",1});
调用的对象为Admin,调用的方法为println(String para1,String para2),传入的参数值为一个字符串”admin”和一个int类型数据1。
当指定的方法为一个静态方法时,在调用该方法的时候,我们可以将第一个参数传入一个null值,另外也可以传入一个对象,如:
m3.invoke(null, null);
m3.invoke(obj,null);