有Student类:
package testreflection;
public class Student{
private static int count;
private String stuNum;
public Student(String stuNum) {
// TODO Auto-generated constructor stub
this.stuNum = stuNum;
count++;
}
public String getStuNum() {
return stuNum;
}
private void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public static int getCount() {
return count;
}
}
利用反射来调用Student类的方法的测试代码如下:
package testreflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Student student = new Student("20101120244");
/**
* getMethod的方法签名如下:
* getMethod(String name, Class<?>... parameterTypes),
* 第一个参数是方法名,接下来的参数是要调用的方法的参数列表各类型
* 对应的Class对象
*/
Method m1 = student.getClass().getMethod("getStuNum");
m1.setAccessible(true);
/**
* invoke的方法签名如下:
* invoke(Object obj, Object... args),
* 第一个参数是方法所属的对象,如果是静态方法,设置为null,
* 接下来的参数是要传递给要调用的方法的参数
*/
System.out.println(m1.invoke(student));
// 访问私有方法需要用getDeclaredMethod获得Method对象
Method m2 = student.getClass().getDeclaredMethod("setStuNum", String.class);
m2.setAccessible(true);
m2.invoke(student, "20121120064");
System.out.println(m1.invoke(student));
Method m3 = Student.class.getMethod("getCount");
System.out.println(m3.invoke(null));
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果如下:
20101120244
20121120064
1