从字节码文件。获取成员方法,并运行,重要部分
测试类:
A 获取字节码文件对象
B 通过字节码文件对象,获取成员方法
Method[] getDeclaredMethods() 获得方法包括公有私有 但是不包含继承的方法
Method[] getMethods() 获取所有的,返回数组,公共的,继承的
MethodgetMethod(方法名,方法中的参数)获取指定的方法(只写方法名 代表无参方法)
Method getDeclaredMethod(方法名)
获取私有方法
C 调用Method方法中的invoke运行方法
数据bean;
package com.mth.bean;
public class Person {
private String name;
private int age;
public String city;
private Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
System.out.println("空参构造方法");
}
public Person(int x) {
super();
System.out.println("int 参数的构造方法!" + x);
}
public void say() {
System.out.println("public.............say");
}
public void run(String s) {
System.out.println(s + "public..........run");
}
private void think() {
System.out.println("private.......think");
}
@Override
public String toString() {
return name + "......" + age + "......" + city;
}
}
测试类:
package com.mth.test;
import java.lang.reflect.Method;
import com.mth.bean.Person;
/*
* 获取成员方法并运行 (重要)
*
* */
public class ReflectFunctionDemo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.mth.bean.Person");
// 获得所有 public方法 包括从Object上面继承下来的
Method[] methods = clazz.getMethods();
for (Method m : methods) {
System.out.println(m);
}
System.out.println("--------------------------------------");
// 获得方法包括公有私有 但是不包含继承的方法
Method[] methods2 = clazz.getDeclaredMethods();
for (Method m : methods2) {
System.out.println(m);
}
System.out.println("--------------------------------------");
// 获取say()方法并运行
Method method = clazz.getMethod("say");// 参数 方法名
System.out.println(method);
// 运行invoke(Object obj(对象) Object... args(参数))
Person p = (Person) clazz.newInstance();
method.invoke(p);
System.out.println("--------------------------------------");
// 获取带有String参数的run()方法
Method method1 = clazz.getMethod("run", String.class);// 参数( 方法名 , 参数类名)
System.out.println(method1);
// 运行invoke(Object obj(对象) Object... args(参数))
Person p1 = (Person) clazz.newInstance();
method1.invoke(p1, "你好");
System.out.println("--------------------------------------");
// 获取私有方法think()
Method method2 = clazz.getDeclaredMethod("think");
System.out.println(method2);
Person p2 = (Person) clazz.newInstance();
//私有方法运行之前 先调用setAccessible()
method2.setAccessible(true);
method2.invoke(p2);
}
}