如果想要對指定名稱的字節碼文件進行加載並獲取其中的內容並調用,這時就使用到了反射技術。所謂的框架就是對外提供一些接口,也就是功能擴展的標准,由實現類按照這個接口標准去實現。框架內部如果需要操縱這些實現類的對象完成某些操作,那么只需要把這些實現類的全名(包名+類名)寫在某個配置文件中,框架代碼只需要讀取這個配置文件,就可以獲取這個實現類的字節碼文件,然后利 用反射技術創建這個實現類的對象並且調用相應的方法完成一些操作。用於描述字節碼的類就是Class類,創建對象,可以提取字節碼文件中的內容,如字段、構造函數、一 般函數。該類就可以獲取字節碼文件中的所有內容,那么反射就是依靠該類完成的。想要對一個類文件進行解剖,只要獲取到該類的字節碼文件對象即可。
示例:獲取字節碼文件對象的3種方式
Person.java
public class Person { private int age; private String name; public Person(int age, String name) { super(); this.age = age; this.name = name; System.out.println("Person param run..." + this.name + ":" + this.age); } public Person() { super(); System.out.println("person run"); } public void show() { System.out.println(name + "...show run..." + age); } private void privateMethod() { System.out.println("method run"); } public void paramMethod(String str, int num) { System.out.println("paramMethod run..." + str + ":" + num); } public static void staticMethod() { System.out.println("static method run..."); } }
ReflectDemo.java
public class ReflectDemo { /** * @param args */ // 要想要對字節碼文件進行解剖,必須要有字節碼文件對象。 public static void main(String[] args) throws ClassNotFoundException { getClassObject_1(); System.out.println("-------------------- "); getClassObject_2(); System.out.println("-------------------- "); getClassObject_3(); } /* * * 獲取字節碼對象的方式: * * 方式一:Object類中的getClass()方法的。 * * 想要用這種方式,必須要明確具體的類,並創建對象。 * * 麻煩。 */ public static void getClassObject_1() { Person p = new Person(); Class clazz = p.getClass(); Person p1 = new Person(); Class clazz1 = p1.getClass(); System.out.println(clazz == clazz1); } /* * * 方式二:任何數據類型都具備一個靜態的屬性.class來獲取其對應的Class對象。 相對簡單,但是還是要明確用到類中的靜態成員。 還是不夠擴展。 */ public static void getClassObject_2() { Class clazz = Person.class; Class clazz1 = Person.class; System.out.println(clazz == clazz1); } /* * * 方式三:只要通過給定的類的字符串名稱就可以獲取該類,更為擴展。 可以用Class類中的方法完成。 * * 該方法就是forName。 * * 這種方法只要有名稱即可,更為方便,擴展性更強。 */ public static void getClassObject_3() throws ClassNotFoundException { // 可以把類的字符串名稱寫到配置文件中,然后讀取出來。 String className = "Person"; Class clazz = Class.forName(className); System.out.println(clazz); } }
