欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java中反射機(jī)制代碼,java中反射機(jī)制代碼是什么

北大青鳥(niǎo)java培訓(xùn):Java的反射機(jī)制?

Java反射機(jī)制是一個(gè)非常強(qiáng)大的功能,在很多大型項(xiàng)目比如Spring,Mybatis都可以看見(jiàn)反射的身影。

創(chuàng)新互聯(lián)公司專注于吉安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供吉安營(yíng)銷(xiāo)型網(wǎng)站建設(shè),吉安網(wǎng)站制作、吉安網(wǎng)頁(yè)設(shè)計(jì)、吉安網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造吉安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供吉安網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

通過(guò)反射機(jī)制我們可以在運(yùn)行期間獲取對(duì)象的類(lèi)型信息,利用這一特性我們可以實(shí)現(xiàn)工廠模式和代理模式等設(shè)計(jì)模式,同時(shí)也可以解決Java泛型擦除等令人苦惱的問(wèn)題。

下面java課程就從實(shí)際應(yīng)用的角度出發(fā),來(lái)應(yīng)用一下Java的反射機(jī)制。

反射基礎(chǔ)p.s:本文需要讀者對(duì)反射機(jī)制的API有一定程度的了解,如果之前沒(méi)有接觸過(guò)的話,建議先看一下官方文檔的QuickStart。

在應(yīng)用反射機(jī)制之前,首先我們先來(lái)看一下如何獲取一個(gè)對(duì)象對(duì)應(yīng)的反射類(lèi)Class,在Java中我們有三種方法可以獲取一個(gè)對(duì)象的反射類(lèi)。

通過(guò)getClass方法在Java中,每一個(gè)Object都有一個(gè)getClass方法,通過(guò)getClass方法我們可以獲取到這個(gè)對(duì)象對(duì)應(yīng)的反射類(lèi):Strings="ziwenxie";Class?c=s.getClass();通過(guò)forName方法我們也可以調(diào)用Class類(lèi)的靜態(tài)方法forName:Class?c=Class.forName("java.lang.String");使用.class或者我們也可以直接使用.class:Class?c=String.class;獲取類(lèi)型信息在文章開(kāi)頭我們就提到反射的一大好處就是可以允許我們?cè)谶\(yùn)行期間獲取對(duì)象的類(lèi)型信息,下面我們通過(guò)一個(gè)例子來(lái)具體看一下。

首先我們?cè)趖ypeinfo.interfacea包下面新建一個(gè)接口A:packagetypeinfo.interfacea;publicinterfaceA{voidf();}接著我們?cè)趖ypeinfo.packageaccess包下面新建一個(gè)接口C,接口C繼承自接口A,并且我們還另外創(chuàng)建了幾個(gè)用于測(cè)試的方法,注意下面幾個(gè)方法的權(quán)限都是不同的。

Java反射機(jī)制

反射需要提供完整的類(lèi)名(包括包名),如com.xxx.Cxx,你創(chuàng)建的類(lèi)沒(méi)有定義包名,自然字節(jié)輸入就可以(因?yàn)轭?lèi)名就是它的全稱),而String的全稱是java.lang.String

JAVA反射機(jī)制代碼

1.就是說(shuō)根據(jù)你傳進(jìn)去的對(duì)象類(lèi)型返回相應(yīng)的代理。這個(gè)不是在靜態(tài)編譯時(shí)決定的, 而是運(yùn)行時(shí)決定的,所以叫做動(dòng)態(tài)。this指的是當(dāng)前InvocationHandler對(duì)象,也就是new MyInvocationHandler()出來(lái)的。

2.執(zhí)行RealSubject中的say方法,因?yàn)檫@個(gè)時(shí)候?qū)嶋H的對(duì)象是bind(new RealSubject())。

3.沒(méi)有調(diào)用自己啊。

java反射機(jī)制詳解

反射就是把Java的各種成分映射成相應(yīng)的Java類(lèi)。

Class類(lèi)的構(gòu)造方法是private,由JVM創(chuàng)建。

反射是java語(yǔ)言的一個(gè)特性,它允程序在運(yùn)行時(shí)(注意不是編譯的時(shí)候)來(lái)進(jìn)行自我檢查并且對(duì)內(nèi)部的成員進(jìn)行操作。例如它允許一個(gè)java的類(lèi)獲取他所有的成員變量和方法并且顯示出來(lái)。Java 的這一能力在實(shí)際應(yīng)用中也許用得不是很多,但是在其它的程序設(shè)計(jì)語(yǔ)言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒(méi)有辦法在程序中獲得函數(shù)定義相關(guān)的信息。(來(lái)自Sun)

JavaBean 是 reflection 的實(shí)際應(yīng)用之一,它能讓一些工具可視化的操作軟件組件。這些工具通過(guò) reflection 動(dòng)態(tài)的載入并取得 Java 組件(類(lèi)) 的屬性。

反射是從1.2就有的,后面的三大框架都會(huì)用到反射機(jī)制,涉及到類(lèi)"Class",無(wú)法直接new CLass(),其對(duì)象是內(nèi)存里的一份字節(jié)碼.

Class 類(lèi)的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類(lèi)和接口。枚舉是一種類(lèi),注釋是一種接口。每個(gè)數(shù)組屬于被映射為 Class 對(duì)象的一個(gè)類(lèi),所有具有相同元素類(lèi)型和維數(shù)的數(shù)組都共享該 Class 對(duì)象。

基本的 Java類(lèi)型(boolean、byte、char、short、int、long、float 和 double)和關(guān)鍵字 void 也表示為 Class 對(duì)象。Class 沒(méi)有公共構(gòu)造方法。

Class 對(duì)象是在加載類(lèi)時(shí)由 Java 虛擬機(jī)以及通過(guò)調(diào)用類(lèi)加載器中的 defineClass 方法自動(dòng)構(gòu)造的。

Person p1 = new Person();

//下面的這三種方式都可以得到字節(jié)碼

CLass c1 = Date.class();

p1.getClass();

//若存在則加載,否則新建,往往使用第三種,類(lèi)的名字在寫(xiě)源程序時(shí)不需要知道,到運(yùn)行時(shí)再傳遞過(guò)來(lái)

Class.forName("java.lang.String");

Class.forName()字節(jié)碼已經(jīng)加載到j(luò)ava虛擬機(jī)中,去得到字節(jié)碼;java虛擬機(jī)中還沒(méi)有生成字節(jié)碼 用類(lèi)加載器進(jìn)行加載,加載的字節(jié)碼緩沖到虛擬機(jī)中。 

另外,大家可以關(guān)注微信公眾號(hào)Java技術(shù)棧回復(fù):JVM,獲取我整理的系列JVM教程,都是干貨。

考慮下面這個(gè)簡(jiǎn)單的例子,讓我們看看 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 類(lèi)的各方法名以及它們的限制符和返回類(lèi)型。這個(gè)程序使用 Class.forName 載入指定的類(lèi),然后調(diào)用 getDeclaredMethods 來(lái)獲取這個(gè)類(lèi)中定義了的方法列表。java.lang.reflect.Methods 是用來(lái)描述某個(gè)類(lèi)中單個(gè)方法的一個(gè)類(lèi)。

以下示例使用 Class 對(duì)象來(lái)顯示對(duì)象的類(lèi)名:

void printClassName(Object obj) {

System.out.println("The class of " + obj +

" is " + obj.getClass().getName());

}

還可以使用一個(gè)類(lèi)字面值(JLS Section 15.8.2)來(lái)獲取指定類(lèi)型(或 void)的 Class 對(duì)象。例如:

System.out.println("The name of class Foo is: "+Foo.class.getName());

在沒(méi)有對(duì)象實(shí)例的時(shí)候,主要有兩種辦法。

//獲得類(lèi)類(lèi)型的兩種方式

Class cls1 = Role.class;

Class cls2 = Class.forName("yui.Role");

注意第二種方式中,forName中的參數(shù)一定是完整的類(lèi)名(包名+類(lèi)名),并且這個(gè)方法需要捕獲異常。現(xiàn)在得到cls1就可以創(chuàng)建一個(gè)Role類(lèi)的實(shí)例了,利用Class的newInstance方法相當(dāng)于調(diào)用類(lèi)的默認(rèn)的構(gòu)造器。

Object o = cls1.newInstance();

//創(chuàng)建一個(gè)實(shí)例

//Object o1 = new Role(); //與上面的方法等價(jià)

當(dāng)前標(biāo)題:java中反射機(jī)制代碼,java中反射機(jī)制代碼是什么
本文地址:http://chinadenli.net/article34/dsejhpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)電子商務(wù)App設(shè)計(jì)網(wǎng)站維護(hù)品牌網(wǎng)站制作標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作