Java基礎 反射的基礎應用和Class筆記
阿新 • • 發佈:2018-10-20
.get 文件 通過 etag 內存 import sta reflect nac
筆記:
/**直接 throws Exception,完美包含全部異常! * --------------------------- * Class: * 首先創建一個類, 接著編譯程序: javac(exe) file.java,生成.class文件, * 之後執行程序: java(exe) file ,將此.class文件加載到內存中,就是一個運行時類,存在緩存區; * 每一個運行時類只能加載一次! * ------------------------ * 反射: * 有了反射,可以通過反射創建一個類的對象,並調用其中的結構: * //0.聲明Person的class類 * //1.創建clazz對應的運行時類Person 類的對象//newInstance()表示新建一個對象 * // 2.通過反射調用運行時類的指定的屬性 * 2.1調用公用屬性 getField() * 2.2調用任意屬性 getField(),setAccessible(true)設置可更改,然後再set()具體值 * //3.通過反射調用運行時類的指定方法:invoke(p,...) * --------------------- **/
測試代碼:
import org.junit.Test; import java.lang.reflect.*; import java.lang.reflect.Method; public class Test1 { @Test public void test3() throws Exception{ Person p=new Person(); Class clazz=p.getClass(); //通過運行時類的對象,調用其getClass() System.out.println(clazz); }//有了反射,可以通過反射創建一個類的對象,並調用其中的結構 @Test public void test2() throws Exception { //0.聲明Person的class類 Class clazz = Person.class; //1.創建clazz對應的運行時類Person 類的對象 Person p = (Person) clazz.newInstance(); //newInstance()表示新建一個對象 System.out.println(p); //Person{age=0, name=‘null‘}// 2.通過反射調用運行時類的指定的屬性 //2.1調用公用屬性 getField() Field f1 = clazz.getField("name"); f1.set(p, "LiuDeHua"); System.out.println(p); //Person{age=0, name=‘LiuDeHua‘} //2.2調用任意屬性 getField(),setAccessible(true)設置可更改,然後再set()具體值 Field f2 = clazz.getDeclaredField("age"); f2.setAccessible(true); f2.set(p, 2000); System.out.println(p); //Person{age=2000, name=‘LiuDeHua‘} //3.通過反射調用運行時類的指定方法:invoke(p,...) Method m1=clazz.getMethod("show"); m1.invoke(p); //空參數 Method m2=clazz.getMethod("display",String.class); m2.invoke(p,"CHINA"); //有參數參數 } @Test//在有反射以前,如何創建一個類的對象,並調用其中的方法/屬性 public void test1(){ Person p=new Person(); p.setAge(10); p.setName("TangWei"); System.out.println(p); p.show(); p.display("HK"); } } class Person extends Creature<String> implements Comparable,MyInterface { private int age; public String name; public Person() { } public void show(){ System.out.println(this.getClass().getName()+"我是一個人類!"); } public void display(String s){ System.out.print("我的國籍是:"+s); } public Person(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "age=" + age + ", name=‘" + name + ‘\‘‘ + ‘}‘; } @Override public int compareTo(Object o) { return 0; } }
輸出結果:
Person{age=10, name=‘TangWei‘} 任務222_反射.Person我是一個人類! 我的國籍是:HKPerson{age=0, name=‘null‘} Person{age=0, name=‘LiuDeHua‘} Person{age=2000, name=‘LiuDeHua‘} 任務222_反射.Person我是一個人類! 我的國籍是:CHINAclass 任務222_反射.Person
Java基礎 反射的基礎應用和Class筆記