反射

反射:

  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);
    }
}

 

posted @ 2020-07-29 17:54  Yisennnn丶  阅读(141)  评论(0)    收藏  举报