java反射获取和调用方法
class类中获取方法:
public method[] getmethods();//获取包括自身和继承(实现)过来的所有的public方法——method不支持泛型<>,即后面不接<>
public method[] getdeclaredmethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getdeclaredmethod方法 对于method 的方法仍然需要设置
权限。
public method[] getmethod(string methodname, class<t>...parametertypes);//表示获取指定的一个公共的方法,包括继承的
参数: methodname:表示获取的方法的名字
parametertypes:表示获取的方法的参数的class类型
public method[] getdeclaredmethod(string methodname, class<t>...parametertypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法
class clazz = new person().getclass(); try { //调用指定的方法 /*@suppresswarnings("unchecked") method me = clazz.getdeclaredmethod("getname", string.class); me.invoke(clazz.newinstance(),"zhangsan");*/ //获取所有的方法 method[] methods = clazz.getdeclaredmethods(); for (method method : methods) { system.out.println(method.getname()); } } catch (exception e) { e.printstacktrace(); }
对于多个参数的方法调用:getdeclaredmethod后面跟的parametertypes可以理解为class类型的形参 ,通过调用invoke来赋实参 多个参数的赋值 最好是包装在new object[]{}中 。
@suppresswarnings("unchecked") method method = clazz.getdeclaredmethod("getname",new class[]{string.class,int.class}); method.invoke(new person(), new object[]{"zhangsan",10});
调用静态方法
class user{ public static void staticmethod(){ system.out.println(“static mthod invoke.”); } } eg: class<user> clz=user.class; method staticmethod=clz.getmethod(“staticmthod”);
两种方式调用静态方法:
1. 因为静态方法属于所有实例对象公共的,可以创建该类的一个任意对象,通过该对象调用
staticmethod.invoke(clz.newinstance());//staticmethod无参,故参数列表类型不填
2. 如果底层方法是静态的,那么可以忽略指定的obj参数,将obj参数设置为null即可
staticmethod.invoke(null);
更多相关的内容:
一:反射概念
可以通过class类获取某个类的成员变量以及方法,并且调用之。
二:通过反射获取方法、变量、构造方法
@test // 通过反射获取类定义的方法 public void testmethod() throws exception { @suppresswarnings("rawtypes") class clazz = class.forname("java.lang.string"); method[] m = clazz.getdeclaredmethods(); for (int i = 0; i < m.length; i++) { system.out.println(m[i].getname() + " " + m[i].getdeclaringclass()); } } @test // 通过反射获取类定义的变量 public void testfield() throws exception { @suppresswarnings("rawtypes") class clazz = class.forname("java.lang.string"); field[] fields = clazz.getfields(); for (field f : fields) { system.out.println(f.getname()); } } @test // 通过反射获取类定义的构造方法 public void testconstructor() throws exception { @suppresswarnings("rawtypes") class clazz = class.forname("java.lang.string"); @suppresswarnings("rawtypes") constructor[] cons = clazz.getconstructors(); for (@suppresswarnings("rawtypes") constructor c : cons) { system.out.println(c + " " + c.getdeclaringclass()); } }
三:通过反射调用类定义的方法
@test // 通过反射调用类定义的方法 public void testinvokemethod() throws exception { class clazz = class.forname("java.lang.string"); // 定义参数类型 class[] params = new class[1]; params[0] = string.class; method m = clazz.getdeclaredmethod("indexof", params); // 设置参数 object[] p = new object[1]; p[0] = "e"; integer s = (integer) m.invoke("helloworld!", p); system.out.println(s); }
上一篇: MySQL开发规范与使用技巧总结