獲取class對(duì)象的三種方式:
- 獲取Class對(duì)象的方式一:
通過(guò)對(duì)象具備的getClass方法(源于Object類(lèi)的方法)。有點(diǎn)不方便,需要用到該類(lèi),并創(chuàng)建該類(lèi)的對(duì)象,再調(diào)
用getClass方法完成。
Person p = new Person();//創(chuàng)建Peron對(duì)象
Class clazz = p.getClass();//通過(guò)object繼承來(lái)的方法(getClass)獲取Person對(duì)應(yīng)的字節(jié)碼文件對(duì)象 - 獲取Class對(duì)象的方式二:
每一個(gè)類(lèi)型都具備一個(gè)class靜態(tài)屬性,通過(guò)該屬性即可獲取該類(lèi)的字節(jié)碼文件對(duì)象。比第一種簡(jiǎn)單了一些,僅用一個(gè)靜態(tài)屬性就搞定了。但是,還是有一點(diǎn)不方便,還必須要使用到該類(lèi)。
Class clazz = Person.class; - 獲取Class對(duì)象方式三:
* 去找找Class類(lèi)中是否有提供獲取的方法呢?
* 找到了,static Class forName(className);
* 相對(duì)方便的多,不需要直接使用具體的類(lèi),只要知道該類(lèi)的名字即可。
* 而名字完成可以作為參數(shù)進(jìn)行傳遞 ,這樣就可以提高擴(kuò)展性。
* 所以為了動(dòng)態(tài)獲取一個(gè)類(lèi),第三種方式最為常用。
Class clazz = Class.forName("cn.itcast.bean.Person");//必須類(lèi)全名
反射代碼演示
接口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("啊,俺來(lái)也……");
}
@Override
public void service() {
System.out.println("我可以為你服務(wù)……");
}
@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();
}
}
}
通過(guò)讀取配置文件的方式來(lái)使用反射完成對(duì)實(shí)例對(duì)象方法調(diào)用
接口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>
實(shí)現(xiàn)IMyServlet接口
public class MyServlet1 implements IMyServlet {
@Override
public void init() {
System.out.println("MyServlet1誕生了……");
}
@Override
public void service() {
System.out.println("MyServlet1開(kāi)始服務(wù)了……");
}
@Override
public void destory() {
System.out.println("MyServlet1銷(xiāo)毀了……");
}
}
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.創(chuàng)建解析器對(duì)象
SAXReader saxReader = new SAXReader();
//2.使用解析器加載web.xml文件得到document對(duì)象
Document document = saxReader.read("src/cn/web/servlet1/web.xml");
//3.獲取根元素節(jié)點(diǎn)//web-app
Element rootElement = document.getRootElement();
//4.根據(jù)元素名稱(chēng)獲取子元素節(jié)點(diǎn)//servlet
Element servletElement = rootElement.element("servlet");
//5.根據(jù)元素名稱(chēng)獲取servlet-class的文本節(jié)點(diǎn)//servlet-class
String servletClass = servletElement.element("servlet-class").getText();
//System.out.println(servletClass);
//6.通過(guò)類(lèi)全名獲取字節(jié)碼文件
Class clazz = Class.forName(servletClass);
//7.創(chuàng)建實(shí)例對(duì)象
MyServlet1 my = (MyServlet1) clazz.newInstance();
//8.調(diào)用實(shí)例對(duì)象里面的方法
my.init();
my.service();
my.destory();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}