標籤:import access 記憶體 第一個 vat ati 基本使用 bsp 方法
fanShe.java
package example5;
class fanShe{
/*1.應用在一些通用性比較高的代碼中。
*2.後面學的架構,大多數都是應用程式框架來實現的。
*3.在架構開發中,都是基於設定檔來開發。在設定檔中配置了類,可以通過反射得到類中的所有內容,可以讓類中的某個方法來執行。
*類中的所有內容:屬性,沒有參數的構造方法,有參數的構造方法,普通方法。
*反射的原理:
*代碼儲存在.java檔案中儲存至本地硬碟-->編譯得到.class檔案-->把class類使用jvm中的類載入器載入至記憶體-->Class類(位元組碼檔案在記憶體中的表示)
*我如果得到了這個Class類,便可以得到類裡所有的內容
*使用反射首先需要得到Class類(三種方法)
*(1)類名.class
*(2)對象名.getClass()
*(3)使用Class.forName("類的路徑")
*屬性通過一個類Field獲得。
*構造方法通過一個類constructor獲得。
*普通方法通過一個類method獲得。
*/
private String name;
int age;
//無參數的構造方法
public fanShe() {}
//有參數的構造方法
public fanShe(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
testFanshe.java
package example5;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
class testFanshe {
public static void main(String[] args) throws Exception {
// 得到Class類的三種方法
Class c1 = fanShe.class;
Class c2 = new fanShe().getClass();
Class c3 = Class.forName("example5.fanShe");
/*test1();
test2();
test3();*/
test4();
}
// 反射操作無參數的構造方法
public static void test1() throws Exception {
Class c3 = Class.forName("example5.fanShe");
// 得到反射類的一個執行個體
fanShe f1 = (fanShe) c3.newInstance();
// 用執行個體去調用類中的方法
f1.setName("寶娟");
System.out.println(f1.getName());
}
// 反射操作有參數的構造方法
@Test
public static void test2() throws Exception {
// 得到Class類
Class c3 = Class.forName("example5.fanShe");
// 得到有參數的構造方法類
// 傳遞的是有參數的構造方法裡的參數類型,以class類型傳遞
Constructor con = c3.getConstructor(String.class, int.class);
// 通過有參的構造方法設定執行個體的值
fanShe p1 = (fanShe) con.newInstance("阿蘇", 20);
System.out.println(p1.getName() + " " + p1.getAge());
}
// 反射操作類的屬性
public static void test3() {
// 得到Class類
try {
Class c2 = Class.forName("example5.fanShe");
// 得到類的一個執行個體
fanShe p2 = (fanShe) c2.newInstance();
// 得到name屬性,參數是屬性名稱
Field f1 = c2.getDeclaredField("name");
//表示允許操作私人屬性
f1.setAccessible(true);
//為name屬性設定值,第一個參數是類的一個執行個體,第二個參數是要設定的值。
f1.set(p2, "wangwu");
// 得到屬性值並列印輸出
System.out.println(f1.get(p2));
} catch (Exception e) {
e.printStackTrace();
}
}
//使用反射來操作普通方法
public static void test4() throws Exception {
//得到Class類
Class c4=Class.forName("example5.fanShe");
//得到類的一個執行個體
fanShe p4=(fanShe) c4.newInstance();
//得到普通方法的類的方法,第一個參數是要操作的普通方法的名稱,第二個參數是普通方法中傳入參數的類型。
Method f4=c4.getDeclaredMethod("setAge", int.class);
//操作的是私人方法
f4.setAccessible(true);
//此函數是使普通方法運行,並設定值。第一個參數是類的一個執行個體,第二個參數是要設定的值。
f4.invoke(p4,15);
//將設定的值列印輸出
System.out.println(p4.getAge());
}
/*註:當操作的方法是靜態方法是,由於靜態方法的調用方式是 類名.方法名
* 所以不需要類的執行個體
* 在invoke()方法中的第一個參數直接寫為null
* f4.invoke(null,15);
*/
}
java中反射的基本使用