反射
反射:
1.获取对应的class对象
方式1:
Class clazz = Class.forName("全限定名");

方式2:
Class clazz = 类名.class;

方式3:
Class clazz = 对象.getClass();

2.通过class对象创建一个示例对象(相当于 new 类())
Object clazz = clazz.newInstance();

3.通过class对象获取一个方法
Method method = clazz.getMethod("方法名",Class ... paramType)
paramType为参数的类型

4.让方法执行:
method.invoke(Object 实例对象,Object ... 参数);
Object 实例对象 :以前调用方法的对象
Object ... 参数:该方法运行时需要的参数


public class Demo { @Test public void f1(){ //调用helloMyServlet中方法 HelloMyServlet a = new HelloMyServlet(); a.add(); a.add(10,30); } @Test public void f2() throws Exception { Class clazz = Class.forName("com.yisen.HelloMyServlet"); //通过字节码对象创建一个实例对象 HelloMyServlet a = (HelloMyServlet) clazz.newInstance(); a.add(); } @Test //调用空参的add方法 public void f3() throws Exception { Class clazz = Class.forName("com.yisen.HelloMyServlet"); //通过字节码对象创建一个实例对象 HelloMyServlet a = (HelloMyServlet) clazz.newInstance(); //获取方法对象 Method method = clazz.getMethod("add"); //让方法对象执行 obj:调用这个方法的实例,相当于a,args是该方法执行时所需要的参数 method.invoke(a);//相当于a.add() } @Test //调用有两个参数的add方法 public void f4() throws Exception { //获取class对象 Class clazz = HelloMyServlet.class; //Class clazz = Class.forName("com.yisen.HelloMyServlet"); //通过字节码对象创建一个实例对象 HelloMyServlet a = (HelloMyServlet) clazz.newInstance(); //获取方法对象 Method method = clazz.getMethod("add",int.class,int.class); //让方法对象执行 obj:调用这个方法的实例,相当于a,args是该方法执行时所需要的参数 method.invoke(a,10,30);//相当于a.add(i,j) } }
5.使用xml获取实例对象
import com.yisen.HelloMyServlet; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; public class Demo { @Test public void f1() throws Exception { //定义一个map集合 Map<String,String> map = new HashMap<>(); //往map中放入一个值 key:/hello value:com.yisen.HelloMyServlet map.put("/hello","com.yisen.HelloMyServlet"); //通过key获取value String value = map.get("/hello"); //通过全限定名获取一个实例 Class clazz = Class.forName(value); HelloMyServlet a = (HelloMyServlet) clazz.newInstance(); //调用空参的add方法 Method method = clazz.getMethod("add"); method.invoke(a); } @Test public void f2() throws Exception { //解析xml //创建dom对象 Document doc = new SAXReader().read("E:\\workspaceIDE\\day08\\web\\web.xml"); //通过xpath解析获取servlet-class和url-pattern的标签体 Element servletClass = (Element) doc.selectSingleNode("//servlet-class"); Element urlPattern = (Element) doc.selectSingleNode("//url-pattern"); String classText = servletClass.getText(); String urlText = urlPattern.getText(); //将两个值放入map中,定义一个map集合 Map<String,String> map = new HashMap<>(); //通过key获取value map.put(urlText,classText); String value = map.get(urlText); System.out.println(value); //通过全限定名获取一个实例 Class clazz = Class.forName(value); HelloMyServlet a = (HelloMyServlet) clazz.newInstance(); //调用空参的add方法 Method method = clazz.getMethod("add"); method.invoke(a); } }

浙公网安备 33010602011771号