首先是類的加載,連接,初始化
四種獲取類的Class物件的方法
1、型別名.class說明:
基本資料型別和void,只能通過這種方式,
2、物件.getClass():獲取物件的運行時型別說明:只能用于參考資料型別
3、Class.forName(“類的全名稱")類的全名稱:包.類名
4、類加載器物件.loadClass(“類的全名稱")
然后是四種類加載器
1、引導類加載器(Bootstrap Classloader):又稱為根類加載器它負責加載]ava的核心庫
它用原生代碼(C/C++)來實作的,并不繼承自java.lang.ClassLoder
2、擴展類加載器(Extension ClassLoader) JAVA_HOME/ire/ext/*.jar
3、應用程式類加載器(Application Classloader) classpath下,就是自定義型別
4、自定義類加載器例如:tomcat
Java的類加載的程序是一個雙親(parent)委托模式加載的:
當“應用程式類加載器”接到一個加載任務時:
(1)先搜索記憶體中是否已經加載過了,如果加載過了,就可以找到對應的Class物件,那么就不加載了,
(2)如果沒有找到,把這個任務先提交給“parent”,父加載器接到任務時,也是重復(1)(2)
(3)直到傳給了根加載器,如果根加載器可以加載,就完成了,如果不能加載,往回傳,依次每個加載器嘗試在自己負責的路徑下搜索,如果找到就直接回傳C1ass物件,如果一直回傳到“應用程式類加載器”,還是沒有找到,就會報ClassNotFoundException,

類加載器的作用:
1、最主要的作用:加載類
2、輔助的作用:可以用它來加載“類路徑下”的資源檔案
JavaSE:例如:bin中SrC下檔案-->bin目錄下
ClassLoader:
(1)靜態方法
ClassLoader.getSystemResourceAsStream("src1.properties")
但是這個適用于JavaSE階段,因為它用應用程式類加載器去加載的如果是Web階段,用這個方法是有問題的,因為web階段的類路徑在WEB-INF/classes下,必須由它自定義類加載器
(2)非靜態方法
類加載器物件.getResourceAsStream("src1.properties") Web階段用這個
Properties:Properties類表示了一個持久的屬性集,Properties可保存在流中或從流中加載,屬性串列中每個鍵及其對應值都是字串
通過反射查看類的資訊
在運行期間,動態的獲取某個類的詳細資訊步驟:
1、獲取某個型別的Class物件
2、使用Class和java.lang.reflect包下面的其他型別的API
使用反射生成并操作物件
在運行期間,動態的創建任意型別的物件,
1、Class物件.newInstance()
前提:這個型別必須有無參構造
步驟:
(1)獲取Class物件
(2)直接呼叫Class物件.newInstance()
2、構造器來創建物件
步驟:
(1)獲取Class物件
(2)獲取構造器物件,獲取其中一個
C1ass類中有這樣的方法:
Constructor
parameterTypes:構造器形參的型別串列
(3)用構造器創建對到 java.lang.reflect.Constructor型別中:
T newInstance(Object...initargs)
initargs:創建物件時,給構造器的實參串列
運行期間,動態的為物件的屬性賦值或獲取屬性值步驟:
1、獲取Class物件
2、獲取Field屬性物件
3、創建實體物件,Class代表的型別的實體物件
4、呼叫Fie1d物件.set(實體物件,屬性值)呼叫Field物件.get(實體物件)
說明:如果屬性是私有的,那么可以呼叫Field物件.setAccessible(true);
在運行期間,動態的呼叫任意物件的任意方法步驟:
1、獲取Class物件
2、獲取Method物件
方法有多載,就用方法名+形參串列clazz.getDeclaredMethod(name,parameterTypes)
3、創建實體物件
4、呼叫方法
public static Object createobject() {
try {
// 創建properties集合
Properties pro = new Properties();
// 從檔案中加載內容到集合中
pro.load(BeanDemo.class.getResourceAsStream("/stu.properties"));
// 從集合中獲得類名
String className = pro.getProperty("class");
// 通過反射獲得Class物件
Class c = Class.forName(className);
// 快速創建物件
Object obj = c.newInstance();
// 遍歷集合
Set<String> names = pro.stringPropertyNames();
for (String name : names) {
// 判斷name是否class
if (name.equals("class"))
continue;
// 獲得值
String value = https://www.cnblogs.com/guixinchn/p/pro.getProperty(name);
// name:成員變數名
// 根據成員變數名獲得對應的Field物件
Field f = c.getDeclaredField(name);
// 強制反射
f.setAccessible(true);
// 獲得成員變數的型別
Class typeclass = f.getType();
if (typeclass == int.class) {// 判斷成員變數的資料型別是否是int型別
f.setInt(obj, Integer.parseInt(value));
} else {
// 給物件的賦值
f.set(obj, value);
}
}
// 回傳物件
return obj;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98181.html
標籤:Java
上一篇:Stream API
