java反射 Method
-
获取字节码文件对象
Class c = Class.forName("fieldtest.Student");
-
通过无参构造方法创建对象obj
Constructor con = c.getConstructor(); Object obj = con.newInstance();
-
Method m1 = c.getMethod(“study”);获取study方法
-
m1.invoke(obj);使用obj对象的m1方法
-
如果要用私有方法:
Method m2 = c.getDeclaredMethod(“study”, String.class);
-
在使用invoke执行私有方法之前,要取消对这个方法的访问检查
m2.setAccessible(true);
-
m2.invoke(obj, “数学”);
一些api的内容:
public Method getMethod(String name,Class<?>... parameterTypes)
//第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
/*Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object.
The name parameter is a String specifying the simple name of the desired method.
The parameterTypes parameter is an array of Class objects that identify the method's formal parameter types, in declared order.
If parameterTypes is null, it is treated as if it were an empty array.*/
public Object invoke(Object obj,Object... args)
/*参数:
- obj:调用方法的对象
- args:为指定方法传递的参数值,是一个可变参数
- 返回值:为动态调用指定方法后的实际返回值
*/
例子:
package fieldtest;public class Student {// 成员变量public String name;// 公共private int age;// 私有// 构造方法public Student() {super();// TODO Auto-generated constructor stub}// 私有构造方法private Student(String name) {this.name = name;}public Student(String name, int age) {super();this.name = name;this.age = age;}// 成员方法(getXxx/setXxx)public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 成员方法public void study() {System.out.println("我爱学习java!");}// 私有private void study(String string) {System.out.println("我还爱学习" + string);}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}
package fieldtest;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;public class MethodDemo {public static void main(String[] args) throws Exception {// 获取字节码文件对象Class c = Class.forName("fieldtest.Student");// 获取所有的方法System.out.println("公共方法:");Method[] methods = c.getMethods(); // 获取自己的包括继承父亲的公共方法for (Method method : methods) {System.out.println(method);}System.out.println("所有方法:");Method[] methods1 = c.getDeclaredMethods(); // 获取自己的所有的方法for (Method method : methods1) {System.out.println(method);}Constructor con = c.getConstructor();Object obj = con.newInstance();// 获取单个方法并使用// public Method getMethod(String name,Class<?>... parameterTypes)// 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型Method m1 = c.getMethod("study");// public Object invoke(Object obj,Object... args)// 返回值是Object,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数m1.invoke(obj); // 调用obj对象的m1方法System.out.println("----------");Method m2 = c.getDeclaredMethod("study", String.class);// NoSuchMethodException 访问私有方法 暴力访问m2.setAccessible(true);m2.invoke(obj, "数学");}
}/*
公共方法:
public java.lang.String fieldtest.Student.toString()
public java.lang.String fieldtest.Student.getName()
public void fieldtest.Student.setName(java.lang.String)
public void fieldtest.Student.setAge(int)
public int fieldtest.Student.getAge()
public void fieldtest.Student.study()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
所有方法:
public java.lang.String fieldtest.Student.toString()
public java.lang.String fieldtest.Student.getName()
public void fieldtest.Student.setName(java.lang.String)
public void fieldtest.Student.setAge(int)
public int fieldtest.Student.getAge()
private void fieldtest.Student.study(java.lang.String)
public void fieldtest.Student.study()
我爱学习java!
----------
我还爱学习数学
*/