A. java反射中通過Class.forname()如何帶參數的方法怎麼賦值和調用呀
用Class.forName方法動態載入構造方法帶參數的類。
B. 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裝載成功就表示執行了靜態代碼,而且以後不會再執行這段靜態代碼。
用法示例:
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。
C. 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:強類型。相對高效。
D. JAVA反射中通過Class.forname()如何帶參數的方法怎麼賦值和調用呀
要調用帶參數的方法方法舉個例子:package com;
import java.lang.reflect.Method;
public class InvokeMethod {
public static void main(String args[]){
try
{
//動態載入Student類
Class student = Class.forName("com.Student");
//獲取Student類名稱為printInfo的方法
Method method1 = student.getMethod("printInfo");
//調用printInfo方法
method1.invoke(student.newInstance());
//獲取Student類名稱為printInfo的方法,String.class是方法的參數類型
Method method2 = student.getMethod("printAddress",String.class);
//調用printAddress方法,其中HK是為方法傳遞一個參數值
method2.invoke(student.newInstance(),"hello關知紅");
}catch(Exception e)
{
e.printStackTrace();
}
}
}