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方法不属于任何一个实例化对象。