日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java的reflection机制_Java的Reflection机制

發布時間:2024/9/15 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java的reflection机制_Java的Reflection机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么時候使用Reflection:

在java語言中,創建一個類的對象通常使用new operator,但是如果預先不知道類名,類名是在程序運行過程中通過參數傳遞過來,就沒法使用這種方法了,這種情況下就只能使用Reflection機制了。

使用 Reflection機制可以大大提高程序的可擴展性和可維護性(動態創建類名),所付出的代價是效率的降低。

原理:

當我們編譯一個新創建的類就會產生一個對應Class(注意:是一個類,而不是class關鍵字)對象,并且這個Class對象會被保存在同名.class文件里。

Reflection機制最常用于struts機制。

*** struts是開源軟件。使用Struts的目的是為了幫助我們減少在運用MVC設計模型來開發Web應用的時間。

*** MVC架構:

l? Jsp----->view(視圖)

l? Servlet------>Cotroller(控制)

l? JavaBean------->Model(模型)

使用步驟:

1。獲得Class的object。有三種方法:

1.Class aClassObj = a.getClass();

2.Class aClassObj = a.class();

3.Class aClassObj = Class.forName( "a" );

2。由于new操作會調用到constructor,所以第二步是獲得constructor的object。有以下兩個方法:

1.Constructor cons = aClassObj.getConstructor(

Class[] );

2.Constructor[] cons = aClassObj.getConstructors();

其中1中的Class[]中的每一個成員都是用來描述constructor中的參數類型的Class

object。如:假如在類a中有形如constructor(

String str , OutputStream out )的constructor,那么得到它的Constructor

object的方法就是

Class[] paraType = new Class [ 2 ];

paraType[ 0 ] = String.class;

paraType[ 1 ] = OutputStream.class;

Constructor cons = aClassObj.getConstructor ( paraType );

假如想利用無參constructor來獲得一個Constructor的object,就要使用Constructor

cons = aClassObj.newInstance()方法。

3。獲得該類實例

public

Object aObject()

{

Object[] paraObjArr = new Object[2];

Object[ 0 ] = "name";

Object[ 1 ] = new OutputStream ( "text.txt" );

return cons.newInstance ( paraObjArr )

}

4。獲得該類中的方法。有以下兩種方式:

1.?使用Method

allMethod []= aClassObj.getDeclaredMethods()可以得到所有該類中的方法的對象

2.使用getMethod(參數)可以獲得某個具體的方法,其中參數同獲取構造函數時類似,需要paraType。假如有一個名為"setName"具有一個String類型的參數的方法,可以這樣使用:

Class[] methodParaType = new Class[ 1 ];

methodParaType [0] = String.class;

Method gotmethod = aClassObj.getMethod( "setName" ,methodParaType

);

5。使用該類中的方法。接著上例:

Object[]

methodPara = new Object[1];

methodPara[0] = "wang";

gotmethod.invoke( cons.newInstance ( paraObjArr

),methodPara

);

例:

import java.ang.reflect.*;

public classDumpMethods{

public

static void main (String args[]){

try{

Class c = Class.forName(args[0]);

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);

}

}

}

按如下語句執行:

java DumpMethods java.utilStack

它的結果為:

public java.lang.Object

java.util.Stack.push(java.lang.Object)

public synchronized java.lang.Object

ava.util.Stack.pop()

public synchronized java.lang.Object

java.util.Stack.peek()

public boolean

java.util.Stack.empty()

public synchronized int

java.util.Stack.search(java.lang.Object)

分析:

這個程序使用Class.forName載入指定的類,然后調用getDeclaredMethods來獲取這個類中定義了的方法列表。另外getDeclaredField()可以獲得類的字段域、getDeclaredConstructors()可以獲得類的構造函數。

總結

以上是生活随笔為你收集整理的java的reflection机制_Java的Reflection机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。