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

java反射機制實現(xiàn)代碼 java反射機制使用場景

java課程分享Java的反射機制

Java反射機制是一個非常強大的功能,在很多大型項目比如Spring,Mybatis都可以看見反射的身影。通過反射機制我們可以在運行期間獲取對象的類型信息,利用這一特性我們可以實現(xiàn)工廠模式和代理模式等設計模式,同時也可以解決Java泛型擦除等令人苦惱的問題。下面java課程就從實際應用的角度出發(fā),來應用一下Java的反射機制。

成都創(chuàng)新互聯(lián)公司專注于成都網(wǎng)站建設、網(wǎng)站建設、網(wǎng)頁設計、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務”的宗旨,從客戶的利益和觀點出發(fā),讓客戶在網(wǎng)絡營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴謹?shù)膽B(tài)度對待客戶,用專業(yè)的服務創(chuàng)造價值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。

反射基礎

p.s:本文需要讀者對反射機制的API有一定程度的了解,如果之前沒有接觸過的話,建議先看一下官方文檔的QuickStart。

在應用反射機制之前,首先我們先來看一下如何獲取一個對象對應的反射類Class,在Java中我們有三種方法可以獲取一個對象的反射類。

通過getClass方法

在Java中,每一個Object都有一個getClass方法,通過getClass方法我們可以獲取到這個對象對應的反射類:

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;

獲取類型信息

在文章開頭我們就提到反射的一大好處就是可以允許我們在運行期間獲取對象的類型信息,下面我們通過一個例子來具體看一下。

首先我們在typeinfo.interfacea包下面新建一個接口A:

packagetypeinfo.interfacea;

publicinterfaceA{voidf();}

接著我們在typeinfo.packageaccess包下面新建一個接口C,接口C繼承自接口A,并且我們還另外創(chuàng)建了幾個用于測試的方法,注意下面幾個方法的權(quán)限都是不同的。

JAVA反射機制代碼

1.就是說根據(jù)你傳進去的對象類型返回相應的代理。這個不是在靜態(tài)編譯時決定的, 而是運行時決定的,所以叫做動態(tài)。this指的是當前InvocationHandler對象,也就是new MyInvocationHandler()出來的。

2.執(zhí)行RealSubject中的say方法,因為這個時候?qū)嶋H的對象是bind(new RealSubject())。

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

java反射機制詳解

反射就是把Java的各種成分映射成相應的Java類。

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

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

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

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

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

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

Class 對象是在加載類時由 Java 虛擬機以及通過調(diào)用類加載器中的 defineClass 方法自動構(gòu)造的。

Person p1 = new Person();

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

CLass c1 = Date.class();

p1.getClass();

//若存在則加載,否則新建,往往使用第三種,類的名字在寫源程序時不需要知道,到運行時再傳遞過來

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

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

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

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

以下示例使用 Class 對象來顯示對象的類名:

void printClassName(Object obj) {

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

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

}

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

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

在沒有對象實例的時候,主要有兩種辦法。

//獲得類類型的兩種方式

Class cls1 = Role.class;

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

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

Object o = cls1.newInstance();

//創(chuàng)建一個實例

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

網(wǎng)站欄目:java反射機制實現(xiàn)代碼 java反射機制使用場景
分享鏈接:http://www.chinadenli.net/article26/dddjjjg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)App開發(fā)企業(yè)網(wǎng)站制作品牌網(wǎng)站建設網(wǎng)頁設計公司面包屑導航

廣告

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

h5響應式網(wǎng)站建設