導航:首頁 > 編程語言 > 反射javaforname區別

反射javaforname區別

發布時間:2025-07-04 09:43:44

A. java 中的class.forName()是什麼意思

Class.forName() 是指返回的是一個類。class.forName(),可以通過反射來操作這個類,例如獲取屬性,獲取方法等等。

class.forName是用到了java.lang.Class.forName包的方法,他是通過類的全稱來返回一個類,全稱是指包名稱加類名稱,他是通過jvm來載入的,這樣就可以獲取到這個類了。

Class.forName是用到了java.lang.Class.forName包的方法,全稱是指包名稱加類名稱,是通過jvm來載入的。過jvm就可以獲取到這個類,也可以通過反射來操作這個類,例如獲取屬性,獲取方法等等。這種方式在框架中比較常見。

jvm在裝載類時會執行類的靜態代碼段,要記住靜態代碼是和class綁定的,class裝載成功就表示執行了靜態代碼,而且以後不會再執行這段靜態代碼。


(1)反射javaforname區別擴展閱讀:

用法示例:

class c = Class.forName(「Example」);

factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的介面,可以寫成如下形式:

String className = 「Example」;

class c = Class.forName(className);

factory = (ExampleInterface)c.newInstance();

進一步可以寫成如下形式:

String className = readfromXMlConfig;//從xml 配置文件中獲得字元串

class c = Class.forName(className);

factory = (ExampleInterface)c.newInstance();

上面代碼已經不存在Example的類名稱,它的優點是,無論Example類怎麼變化,上述代碼不變,甚至可以更換Example的兄弟類Example2 , Example3 , Example4……,只要他們繼承ExampleInterface就可以。

Class.forName()用法詳解:

Class.forName(xxx.xx.xx)返回的是一個類。Class.forName(xxx.xx.xx)的作用是要求JVM查找並載入指定的類,也就是說JVM會執行該類的靜態代碼段。

當一個class被載入,或當載入器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class 對象。

如果想藉由「修改Java標准庫源碼」來觀察Class 對象的實際生成時機(例如在Class的constructor內添加一個println()),這樣是行不通的!因為Class並沒有public constructor。

B. java下Class.forName的作用是什麼,為什麼要使用它

首先你要明白在java裡面任何class都要裝載在虛擬機上才能運行。這句話就是裝載類用的(和new不一樣,要分清楚)。
Aa=(A)Class.forName("pacage.A").newInstance();這和你Aa=newA();
是一樣的效果。
關於補充的問題
答案是肯定的,jvm會執行靜態代碼段,你要記住一個概念,靜態代碼是和class綁定的,class裝載成功就表示執行了你的靜態代碼了。而且以後不會再走這段靜態代碼了。
Class.forName(xxx.xx.xx)返回的是一個類
Class.forName(xxx.xx.xx);的作用是要求JVM查找並載入指定的類,也就是說JVM會執行該類的靜態代碼段
動態載入和創建Class對象,比如想根據用戶輸入的字元串來創建對象
Stringstr=用戶輸入的字元串
Classt=Class.forName(str);
t.newInstance();
classc=Class.forName(Example);
factory=(ExampleInterface)c.newInstance();
其中ExampleInterface是Example的介面,可以寫成如下形式:
StringclassName="Example";
classc=Class.forName(className);
factory=(ExampleInterface)c.newInstance();
進一步可以寫成如下形式:
StringclassName=readfromXMlConfig;//從xml配置文件中獲得字元串
classc=Class.forName(className);
factory=(ExampleInterface)c.newInstance();
從JVM的角度看,我們使用關鍵字new創建一個類的時候,這個類可以沒有被載入。但是使用newInstance()方法的時候,就必須保證:1、這個類已經載入;2、這個類已經連接了。而完成上面兩個步驟的正是Class的靜態方法forName()所完成的,這個靜態方法調用了啟動類載入器,即載入javaAPI的那個載入器。
現在可以看出,newInstance()實際上是把new這個方式分解為兩步,即首先調用Class載入方法載入某個類,然後實例化。這樣分步的好處是顯而易見的。我們可以在調用class的靜態載入方法forName時獲得更好的靈活性,提供給了一種降耦的手段。
最後用最簡單的描述來區分new關鍵字和newInstance()方法的區別:
newInstance:弱類型。低效率。只能調用無參構造。
new:強類型。相對高效。

C. 反射機制的Java中

Reflection 是 Java 程序開發語言的特徵之一,它允許運行中的 Java 程序對自身進行檢查,或者說「自審」,並能直接操作程序的內部屬性。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
1.檢測類:
1.1 reflection的工作機制
考慮下面這個簡單的例子,讓我們看看 reflection 是如何工作的。
import java.lang.reflect.*;
public class DumpMethods {
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.util.Stack
它的結果輸出為:
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.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)
這樣就列出了java.util.Stack 類的各方法名以及它們的限制符和返回類型。
這個程序使用 Class.forName 載入指定的類,然後調用 getDeclaredMethods 來獲取這個類中定義了的方法列表。java.lang.reflect.Methods 是用來描述某個類中單個方法的一個類。
1.2 Java類反射中的主要方法
對於以下三類組件中的任何一類來說 -- 構造函數、欄位和方法 -- java.lang.Class 提供四種獨立的反射調用,以不同的方式來獲得信息。調用都遵循一種標准格式。以下是用於查找構造函數的一組反射調用:
Constructor getConstructor(Class[] params) -- 獲得使用特殊的參數類型的公共構造函數,
Constructor[] getConstructors() -- 獲得類的所有公共構造函數
Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定參數類型的構造函數(與接入級別無關)
Constructor[] getDeclaredConstructors() -- 獲得類的所有構造函數(與接入級別無關)
獲得欄位信息的Class 反射調用不同於那些用於接入構造函數的調用,在參數類型數組中使用了欄位名:
Field getField(String name) -- 獲得命名的公共欄位
Field[] getFields() -- 獲得類的所有公共欄位
Field getDeclaredField(String name) -- 獲得類聲明的命名的欄位
Field[] getDeclaredFields() -- 獲得類聲明的所有欄位
用於獲得方法信息函數:
Method getMethod(String name, Class[] params) -- 使用特定的參數類型,獲得命名的公共方法
Method[] getMethods() -- 獲得類的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數類型,獲得類聲明的命名的方法
Method[] getDeclaredMethods() -- 獲得類聲明的所有方法
1.3開始使用 Reflection:
用於 reflection 的類,如 Method,可以在 java.lang.relfect 包中找到。使用這些類的時候必須要遵循三個步驟:第一步是獲得你想操作的類的 java.lang.Class 對象。在運行中的 Java 程序中,用 java.lang.Class 類來描述類和介面等。
下面就是獲得一個 Class 對象的方法之一:
Class c = Class.forName(java.lang.String);
這條語句得到一個 String 類的類對象。還有另一種方法,如下面的語句:
Class c = int.class;
或者
Class c = Integer.TYPE;
它們可獲得基本類型的類信息。其中後一種方法中訪問的是基本類型的封裝類 (如 Integer) 中預先定義好的 TYPE 欄位。
第二步是調用諸如 getDeclaredMethods 的方法,以取得該類中定義的所有方法的列表。 一旦取得這個信息,就可以進行第三步了——使用 reflection API 來操作這些信息,如下面這段代碼:
Class c = Class.forName(java.lang.String);
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
它將以文本方式列印出 String 中定義的第一個方法的原型。
2.處理對象:
如果要作一個開發工具像debugger之類的,你必須能發現filed values,以下是三個步驟:
a.創建一個Class對象
b.通過getField 創建一個Field對象
c.調用Field.getXXX(Object)方法(XXX是Int,Float等,如果是對象就省略;Object是指實例).
例如:
import java.lang.reflect.*;
import java.awt.*;
class SampleGet {
public static void main(String[] args) {
Rectangle r = new Rectangle(100, 325);
printHeight(r);
}
static void printHeight(Rectangle r) {
Field heightField;
Integer heightValue;
Class c = r.getClass();
try {
heightField = c.getField(height);
heightValue = (Integer) heightField.get(r);
System.out.println(Height: + heightValue.toString());
} catch (NoSuchFieldException e) {
System.out.println(e);
} catch (SecurityException e) {
System.out.println(e);
} catch (IllegalAccessException e) {
System.out.println(e); } } }

D. java 中反射機制和內省機制的區別是什麼

內省

E. JAVA中反射是什麼

JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。

Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。

(5)反射javaforname區別擴展閱讀:

JAVA中反射實例:

1、Class superClass=clazz.getSuperclass();//獲取父類。

System.out.println("getSuperclass:"+superClass)。

2、Class[] interfaces=clazz.getInterfaces();//獲取實現介面。

System.out.println("getInterfaces:"+interfaces.length)。

3、Constructor[] cons=clazz.getConstructors();//構造方法。

System.out.println("getConstructors:"+cons.length)。

參考資料來源:網路: JAVA反射機制

閱讀全文

與反射javaforname區別相關的資料

熱點內容
智行app鉑金會員怎麼還有期限 瀏覽:581
win10用子文件夾改名 瀏覽:234
ae鋼筆工具在哪裡 瀏覽:460
gn105數據線插哪裡 瀏覽:916
破鎖屏密碼方法 瀏覽:835
股票數據放哪裡 瀏覽:576
m格式庫文件 瀏覽:279
天際通數據服務怎麼開票 瀏覽:430
寫小說發哪個網站比較好 瀏覽:244
小米電視3藍牙文件路徑 瀏覽:111
shell讀取文件值 瀏覽:909
文件夾路徑欄消失 瀏覽:795
律師哪些業務不能代替大數據 瀏覽:952
lol哪些文件可以刪除 瀏覽:701
匯編程序中del是什麼意思 瀏覽:183
幼兒園免費網站模板下載 瀏覽:210
w619線刷教程 瀏覽:759
怎麼培養編程思想 瀏覽:697
手機捆綁app的軟體怎麼卸載 瀏覽:32
vb編程器有什麼用 瀏覽:999

友情鏈接