Java通过反射获取Method方法
1. 创建GFather祖先类,Father父类并且继承GFather类,Son子类并且继承父类。
package reflection.commen;
public class GFather {
public int g_age = 1;
public String g_name = "爷爷";
public GFather(){
}
public GFather(int age, String name) {
this.g_age = age;
this.g_name = name;
}
public int getG_age() {
return g_age;
}
private void setG_age(int g_age) {
this.g_age = g_age;
}
}
package reflection.commen;
public class Father extends GFather {
private int f_age;
public String f_name;
public Father(){
}
public Father(int father_age, String father_name) {
super();
this.f_age = father_age;
this.f_name = father_name;
}
public int getF_age() {
return f_age;
}
private void setF_age(int f_age) {
this.f_age = f_age;
}
}
package reflection.commen;
import reflection.commen.Father;
public class Son extends Father {
private int s_age;
public String s_name;
public Son(){
}
public Son(int son_age, String son_name, int f_age, String f_name) {
super(f_age,f_name);
this.s_age = son_age;
this.s_name = son_name;
}
public int getS_age() {
return s_age;
}
private void setS_age(int s_age) {
this.s_age = s_age;
}
}
2. getDeclaredMethod(String name, Class<?>… parameterTypes)获取本类定义定义的方法,传入的参数是方法名 + 反射出的方法的形参类型。该方法只能获取本类的所有方法,不能获取祖先类的。
@Test
public void test1() throws Exception{
Son son = new Son(3,"儿子",2,"父亲");
Method set = Class.forName("reflection.commen.Son").getDeclaredMethod("setS_age", int.class); //setS_age(int age) 所以第二个参数是int.class
Method get = Class.forName("reflection.commen.Son").getDeclaredMethod("getS_age");
set.setAccessible(true);
set.invoke(son,100);
System.out.println(get.invoke(son));
}
3. getMethod(String name, Class<?>… parameterTypes)获取本类定义定义的方法,传入的参数是方法名 + 反射出的方法的形参类型。只能获取所有的public方法
@Test
public void test2() throws Exception{
Son son = new Son(3,"儿子",2,"父亲");
Method gets = Class.forName("reflection.commen.Son").getMethod("getS_age");
Method getf = Class.forName("reflection.commen.Son").getMethod("getF_age");
Method getg = Class.forName("reflection.commen.Son").getMethod("getG_age");
System.out.println(gets.getName() + " -> " + gets.invoke(son));
System.out.println(getf.getName() + " -> " + getf.invoke(son));
System.out.println(getg.getName() + " -> " + getg.invoke(son));
Method sets = Class.forName("reflection.commen.Son").getMethod("setS_age",int.class);
sets.setAccessible(true);
sets.invoke(son,50); //修改s_age = 50;
System.out.println(gets.getName() + " -> " + gets.invoke(son));
}
4. getDeclaredMethods()获取本类所有的方法,注意区分不同方法需要传入的参数类型。否则会出现异常问题。
@Test
public void test3() throws Exception{
Son son = new Son(3,"儿子",2,"父亲");
Method[] methods = Class.forName("reflection.commen.Son").getDeclaredMethods();
for(Method m : methods){
m.setAccessible(true);
if(m.getName().equals("setS_age")){ //区分不同函数
m.invoke(son,50); //设置s_age = 50
}
else{
m.invoke(son);
}
System.out.println(m.getName());
}
}
5. getMethods()方法获取子类 + 父类所有的public方法,并且由于所有类的老祖宗都是Object类,因此获得的方法包括object超类的方法。
@Test
public void test4() throws Exception{
Son son = new Son(3,"儿子",2,"父亲");
Method[] methods = Class.forName("reflection.commen.Son").getMethods();
System.out.println(methods.length);
for(Method m : methods){
System.out.println(m.toString());
}
}
6. 这里并没有static方法的调用过程,由于static方法比较特殊是一个静态方法,在使用invoke调用的时候不需要传入对象,因为static方法不属于任何一个实例化对象。