Java反射

獲取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();
    }
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類(lèi)的函數(shù)、...
    Ten_Minutes閱讀 582評(píng)論 0 4
  • 1 什么是反射 Java反射機(jī)制是在運(yùn)行狀態(tài)中 對(duì)于任意一個(gè)類(lèi),都能知道這個(gè)類(lèi)的所以屬性和方法; 對(duì)于任何一個(gè)對(duì)象...
    一個(gè)人的飄閱讀 826評(píng)論 0 0
  • java反射是什么 其實(shí)就是動(dòng)態(tài)的從內(nèi)存加載一個(gè)指定的類(lèi),并獲取該類(lèi)中的所有的內(nèi)容。 反射的好處:大大的增強(qiáng)了程序...
    之后_90閱讀 955評(píng)論 0 1
  • 1.如何創(chuàng)建Class的實(shí)例(重點(diǎn)) 1.1過(guò)程:源文件經(jīng)過(guò)編譯(javac.exe)以后,得到一個(gè)或多個(gè).cla...
    芒果奶油卷閱讀 173評(píng)論 0 0
  • 不論是 Java 開(kāi)發(fā) 還是 Android 開(kāi)發(fā),反射、泛型、注解 都是架構(gòu)設(shè)計(jì)中很重要的一個(gè)知識(shí)點(diǎn)。 為了更好...
    JamFF閱讀 584評(píng)論 0 4

友情鏈接更多精彩內(nèi)容