Java反射

获取class对象的三种方式:

  • 获取Class对象的方式一:
    通过对象具备的getClass方法(源于Object类的方法)。有点不方便,需要用到该类,并创建该类的对象,再调
    用getClass方法完成。
    Person p = new Person();//创建Peron对象
    Class clazz = p.getClass();//通过object继承来的方法(getClass)获取Person对应的字节码文件对象
  • 获取Class对象的方式二:
    每一个类型都具备一个class静态属性,通过该属性即可获取该类的字节码文件对象。比第一种简单了一些,仅用一个静态属性就搞定了。但是,还是有一点不方便,还必须要使用到该类。
    Class clazz = Person.class;
  • 获取Class对象方式三:
    * 去找找Class类中是否有提供获取的方法呢?
    * 找到了,static Class forName(className);
    * 相对方便的多,不需要直接使用具体的类,只要知道该类的名字即可。
    * 而名字完成可以作为参数进行传递 ,这样就可以提高扩展性。
    * 所以为了动态获取一个类,第三种方式最为常用。
    Class clazz = Class.forName("cn.itcast.bean.Person");//必须类全名

反射代码演示

接口IMyServlet

public interface IMyServlet {

public void init();

public void service();

public void destory();

}

MyServletImpl

public class MyServletImpl implements IMyServlet {

@Override
public void init() {
    System.out.println("啊,俺来也……");
}

@Override
public void service() {
    System.out.println("我可以为你服务……");
}

@Override
public void destory() {
    System.out.println("啊,俺去也……");
}

}

Test

import org.junit.Test;

public class TestMyServlet {
  
@Test
public void testMyServlet(){
    MyServletImpl my = new MyServletImpl();
    my.init();
    my.service();
    my.destory();
}
//反射
@Test
public void testMyServlet1(){
    try {
        String className = "cn.itheima.web.servlet.MyServletImpl";
        Class clazz = Class.forName(className);
        MyServletImpl my = (MyServletImpl) clazz.newInstance();
        my.init();
        my.service();
        my.destory();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

通过读取配置文件的方式来使用反射完成对实例对象方法调用

接口IMyServlet

public interface IMyServlet {

public void init();

public void service();

public void destory();
}

XML文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">

<servlet>
    <servlet-name>MyServlet1</servlet-name>
    <servlet-class>cn.itheima.web.servlet1.MyServlet1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet1</servlet-name>
    <url-pattern>/myServlet1</url-pattern>
</servlet-mapping>
</web-app>

实现IMyServlet接口

public class MyServlet1 implements IMyServlet {

@Override
public void init() {
    System.out.println("MyServlet1诞生了……");
}

@Override
public void service() {
    System.out.println("MyServlet1开始服务了……");
}

@Override
public void destory() {
    System.out.println("MyServlet1销毁了……");
}
}

Test

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class TestMyServlet {

@Test
public void testMyServlet(){
    try {
        //1.创建解析器对象
        SAXReader saxReader = new SAXReader();
        //2.使用解析器加载web.xml文件得到document对象
        Document document = saxReader.read("src/cn/web/servlet1/web.xml");
        //3.获取根元素节点//web-app
        Element rootElement = document.getRootElement();
        //4.根据元素名称获取子元素节点//servlet
        Element servletElement = rootElement.element("servlet");
        //5.根据元素名称获取servlet-class的文本节点//servlet-class
        String servletClass = servletElement.element("servlet-class").getText();
        //System.out.println(servletClass);
        //6.通过类全名获取字节码文件
        Class clazz = Class.forName(servletClass);
        //7.创建实例对象
        MyServlet1 my = (MyServlet1) clazz.newInstance();
        //8.调用实例对象里面的方法
        my.init();
        my.service();
        my.destory();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数、...
    Ten_Minutes阅读 3,520评论 0 4
  • 1 什么是反射 Java反射机制是在运行状态中 对于任意一个类,都能知道这个类的所以属性和方法; 对于任何一个对象...
    一个人的飘阅读 4,095评论 0 0
  • java反射是什么 其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容。 反射的好处:大大的增强了程序...
    之后_90阅读 4,388评论 0 1
  • 1.如何创建Class的实例(重点) 1.1过程:源文件经过编译(javac.exe)以后,得到一个或多个.cla...
    芒果奶油卷阅读 1,027评论 0 0
  • 不论是 Java 开发 还是 Android 开发,反射、泛型、注解 都是架构设计中很重要的一个知识点。 为了更好...
    JamFF阅读 3,483评论 0 4