反射:
1.获取对应的class对象
方式1:★
Class clazz=Class.forName("全限定名");(包名.类名)
方式2:
Class clazz=类名.class;
方式3:
Class clazz==对象.getClass();
2.通过class对象创建一个实例对象(相当于 new 类())
Object clazz.newInstance();
3.通过class对象获取一个方法(public修饰的)
Method method=clazz.getMethod("方法名",Class .... paramType);
paramType为参数的类型
4.让方法执行:
method.invoke(Object 实例对象,Object ... 参数);
Object 实例对象:以前调用方法的对象 就是a
Object ... 参数:该方法运行时需要的参数 就是 10和30
执行这个方法 相当于
a.add(10,30);
例如:
method.invoke(a,10,30)
代码练习
package cn.feizhu;
public class HelloMyServlet {
public void add() {
System.out.println("无參的add方法");
}
public void add(int a,int b) {
System.out.println("有两个参数的add方法");
}
public int add(int c) {
System.out.println("含有返回类型的add方法");
return c+10;
}
}
2、
package cn.feizhu.reflect;
import java.lang.reflect.Method;
import org.junit.jupiter.api.Test;
import cn.feizhu.HelloMyServlet;
public class Demo {
@Test
public void f1() {
//调用HelloMyServlet中的方法
HelloMyServlet a= new HelloMyServlet();
a.add();
a.add(10,20);
}
//调用空参的构造方法
@Test
public void f2() throws Exception {
Class clazz=Class.forName("cn.feizhu.HelloMyServlet");
//通过字符码对象创建一个实例对象(相当于调用空参的构造器)
HelloMyServlet a=(HelloMyServlet) clazz.newInstance();
//获取方法对象
Method method=clazz.getMethod("add");
//让方法对象执行 obj调用这个方法的实例,相当于a a.add(),args是该方法执行时所需要的参数
method.invoke(a);
}
//调用有两个参数的add方法
@Test
public void f3() throws Exception {
//获取Class对象
Class clazz=HelloMyServlet.class;
//通过clazz对象创建一个实例
HelloMyServlet a=(HelloMyServlet) clazz.newInstance();
//获取有两个参数的add方法
Method m=clazz.getMethod("add", int.class,int.class);
//执行方法
m.invoke(a, 10,20);
}
}
备注:由于个人原因,本博客暂停更新。如有问题可联系本人,本人提供技术指导、学习方向、学习路线。本人微信wlp1156107728(添加注明来意) QQ1156107728(添加注明来意)