新聞中心
北大青鳥java培訓(xùn):Java的反射機(jī)制?
Java反射機(jī)制是一個(gè)非常強(qiáng)大的功能,在很多大型項(xiàng)目比如Spring,Mybatis都可以看見反射的身影。
創(chuàng)新互聯(lián)公司專注于吉安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供吉安營銷型網(wǎng)站建設(shè),吉安網(wǎng)站制作、吉安網(wǎng)頁設(shè)計(jì)、吉安網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造吉安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供吉安網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
通過反射機(jī)制我們可以在運(yùn)行期間獲取對象的類型信息,利用這一特性我們可以實(shí)現(xiàn)工廠模式和代理模式等設(shè)計(jì)模式,同時(shí)也可以解決Java泛型擦除等令人苦惱的問題。
下面java課程就從實(shí)際應(yīng)用的角度出發(fā),來應(yīng)用一下Java的反射機(jī)制。
反射基礎(chǔ)p.s:本文需要讀者對反射機(jī)制的API有一定程度的了解,如果之前沒有接觸過的話,建議先看一下官方文檔的QuickStart。
在應(yīng)用反射機(jī)制之前,首先我們先來看一下如何獲取一個(gè)對象對應(yīng)的反射類Class,在Java中我們有三種方法可以獲取一個(gè)對象的反射類。
通過getClass方法在Java中,每一個(gè)Object都有一個(gè)getClass方法,通過getClass方法我們可以獲取到這個(gè)對象對應(yīng)的反射類:Strings="ziwenxie";Class?c=s.getClass();通過forName方法我們也可以調(diào)用Class類的靜態(tài)方法forName:Class?c=Class.forName("java.lang.String");使用.class或者我們也可以直接使用.class:Class?c=String.class;獲取類型信息在文章開頭我們就提到反射的一大好處就是可以允許我們在運(yùn)行期間獲取對象的類型信息,下面我們通過一個(gè)例子來具體看一下。
首先我們在typeinfo.interfacea包下面新建一個(gè)接口A:packagetypeinfo.interfacea;publicinterfaceA{voidf();}接著我們在typeinfo.packageaccess包下面新建一個(gè)接口C,接口C繼承自接口A,并且我們還另外創(chuàng)建了幾個(gè)用于測試的方法,注意下面幾個(gè)方法的權(quán)限都是不同的。
Java反射機(jī)制
反射需要提供完整的類名(包括包名),如com.xxx.Cxx,你創(chuàng)建的類沒有定義包名,自然字節(jié)輸入就可以(因?yàn)轭惷褪撬娜Q),而String的全稱是java.lang.String
JAVA反射機(jī)制代碼
1.就是說根據(jù)你傳進(jìn)去的對象類型返回相應(yīng)的代理。這個(gè)不是在靜態(tài)編譯時(shí)決定的, 而是運(yùn)行時(shí)決定的,所以叫做動態(tài)。this指的是當(dāng)前InvocationHandler對象,也就是new MyInvocationHandler()出來的。
2.執(zhí)行RealSubject中的say方法,因?yàn)檫@個(gè)時(shí)候?qū)嶋H的對象是bind(new RealSubject())。
3.沒有調(diào)用自己啊。
java反射機(jī)制詳解
反射就是把Java的各種成分映射成相應(yīng)的Java類。
Class類的構(gòu)造方法是private,由JVM創(chuàng)建。
反射是java語言的一個(gè)特性,它允程序在運(yùn)行時(shí)(注意不是編譯的時(shí)候)來進(jìn)行自我檢查并且對內(nèi)部的成員進(jìn)行操作。例如它允許一個(gè)java的類獲取他所有的成員變量和方法并且顯示出來。Java 的這一能力在實(shí)際應(yīng)用中也許用得不是很多,但是在其它的程序設(shè)計(jì)語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數(shù)定義相關(guān)的信息。(來自Sun)
JavaBean 是 reflection 的實(shí)際應(yīng)用之一,它能讓一些工具可視化的操作軟件組件。這些工具通過 reflection 動態(tài)的載入并取得 Java 組件(類) 的屬性。
反射是從1.2就有的,后面的三大框架都會用到反射機(jī)制,涉及到類"Class",無法直接new CLass(),其對象是內(nèi)存里的一份字節(jié)碼.
Class 類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個(gè)數(shù)組屬于被映射為 Class 對象的一個(gè)類,所有具有相同元素類型和維數(shù)的數(shù)組都共享該 Class 對象。
基本的 Java類型(boolean、byte、char、short、int、long、float 和 double)和關(guān)鍵字 void 也表示為 Class 對象。Class 沒有公共構(gòu)造方法。
Class 對象是在加載類時(shí)由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的 defineClass 方法自動構(gòu)造的。
Person p1 = new Person();
//下面的這三種方式都可以得到字節(jié)碼
CLass c1 = Date.class();
p1.getClass();
//若存在則加載,否則新建,往往使用第三種,類的名字在寫源程序時(shí)不需要知道,到運(yùn)行時(shí)再傳遞過來
Class.forName("java.lang.String");
Class.forName()字節(jié)碼已經(jīng)加載到j(luò)ava虛擬機(jī)中,去得到字節(jié)碼;java虛擬機(jī)中還沒有生成字節(jié)碼 用類加載器進(jìn)行加載,加載的字節(jié)碼緩沖到虛擬機(jī)中。
另外,大家可以關(guān)注微信公眾號Java技術(shù)棧回復(fù):JVM,獲取我整理的系列JVM教程,都是干貨。
考慮下面這個(gè)簡單的例子,讓我們看看 reflection 是如何工作的。
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName("java.util.Stack");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i m.length; i++)
System.out.println(m[i].toString());
}
catch (Throwable e){
System.err.println(e);
}
}
}
public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized int java.util.Stack.search(java.lang.Object)
這樣就列出了java.util.Stack 類的各方法名以及它們的限制符和返回類型。這個(gè)程序使用 Class.forName 載入指定的類,然后調(diào)用 getDeclaredMethods 來獲取這個(gè)類中定義了的方法列表。java.lang.reflect.Methods 是用來描述某個(gè)類中單個(gè)方法的一個(gè)類。
以下示例使用 Class 對象來顯示對象的類名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
還可以使用一個(gè)類字面值(JLS Section 15.8.2)來獲取指定類型(或 void)的 Class 對象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
在沒有對象實(shí)例的時(shí)候,主要有兩種辦法。
//獲得類類型的兩種方式
Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");
注意第二種方式中,forName中的參數(shù)一定是完整的類名(包名+類名),并且這個(gè)方法需要捕獲異常。現(xiàn)在得到cls1就可以創(chuàng)建一個(gè)Role類的實(shí)例了,利用Class的newInstance方法相當(dāng)于調(diào)用類的默認(rèn)的構(gòu)造器。
Object o = cls1.newInstance();
//創(chuàng)建一個(gè)實(shí)例
//Object o1 = new Role(); //與上面的方法等價(jià)
網(wǎng)站標(biāo)題:java中反射機(jī)制代碼,java中反射機(jī)制代碼是什么
文章起源:http://www.ef60e0e.cn/article/dsejhpe.html