获取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();
}
}
}