標籤:reflection 反射 通過反射訪問構造方法
反射Reflection
import java.lang.reflect.Modifier;/* * 反射Reflection * java.lang.Class類 */public class Test01 { public static void main(String[] args) { String name = "tom"; // 方式一:通過對象getClass()方法 // 任意一個類的對象,都有一個getClass()方法 // 可以通過此擷取擷取當前對象的類型所對應的Class對象 Class cls = name.getClass(); showInfo(cls); //方式二:通過Class類的forName()靜態方法 try { Class cls2=Class.forName("com.itany.basejava.day37.Test01"); showInfo(cls2); } catch (ClassNotFoundException e) { e.printStackTrace(); } //方式三:通過指定類的class屬性 Class cls3=Student.class; showInfo(cls3); } // 擷取Class對象的相關資訊 public static void showInfo(Class cls) { System.out.println("類的全名:" + cls.getName()); System.out.println("類名:" + cls.getSimpleName()); System.out.println("所屬包:" + cls.getPackage()); System.out.println("是否為本地類:" + cls.isLocalClass()); System.out.println("是否為介面:" + cls.isInterface()); System.out.println("是否為數組:" + cls.isArray()); System.out.println("是否為基礎資料型別 (Elementary Data Type):" + cls.isPrimitive()); // 擷取其父類的Class對象 Class superCls = cls.getSuperclass(); System.out.println("父類的全名:" + superCls.getName()); // 擷取類的修飾符 int m = cls.getModifiers(); System.out.println("修飾符為:"); if (Modifier.isPublic(m)) { System.out.print("public "); } if (Modifier.isStatic(m)) { System.out.print("static "); } if (Modifier.isAbstract(m)) { System.out.print("abstract "); } if (Modifier.isFinal(m)) { System.out.print("final "); } System.out.println("**************************************\n"); }}
通過反射訪問構造方法,執行個體化對象
import java.lang.reflect.Constructor;import java.lang.reflect.Method;/* * 通過反射訪問構造方法,執行個體化對象 * Constructor類 */public class Test03 { public static void main(String[] args) throws Exception { // 建立一個Dog類的對象 // Dog dog1=new Dog("大黃", 3, "男"); // 建立一個Dog類的Class對象 Class<Dog> cls = Dog.class; /* * 執行個體化無參建構函式的對象,兩種方式 */ // 1.通過Class對象的newInstance()方法建立執行個體,只適用於通過無參構造方法建立對象 Dog dog = (Dog) cls.newInstance(); // dog.show(); Method method = cls.getDeclaredMethod("show"); method.invoke(dog); System.out.println("*************************\n"); // 2.擷取參數為空白的構造方法 Constructor c = cls.getDeclaredConstructor(); Dog dog2 = (Dog) c.newInstance(); dog2.show(); System.out.println("*************************\n"); /* * 執行個體化帶參構造方法的對象 */ Constructor c2 = cls.getDeclaredConstructor(new Class[] { String.class, int.class, String.class }); Dog dog3 = (Dog) c2.newInstance("小黃", 2, "女"); dog3.show(); /* * 通過private修飾的構造方法執行個體化對象 */ Constructor<Dog> c3 = cls.getDeclaredConstructor(new Class[] { String.class, String.class }); c3.setAccessible(true); Dog dog4=c3.newInstance("巨黃","中"); dog4.show(); }}/* * Animal父類 */class Animal { public String name; int age; public Animal() { System.out.println("父類無參的構造方法"); } public Animal(String name, int age) { this.name = name; this.age = age; System.out.println("父類中帶參的構造方法"); } public void show() { System.out.println("父類中的show方法"); }}/* * Dog類,繼承自Animal */class Dog extends Animal { String sex; public Dog() { System.out.println("子類中無參的構造方法"); } public Dog(String name, int age, String sex) { System.out.println("子類中帶參的構造方法"); } private Dog(String name, String sex) { System.out.println("子類中帶兩個參數的構造方法"); } // 重寫父類中的show方法 public void show() { System.out.println("子類中的show方法"); }}
Field類
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/* * Field類 */public class Test02 { public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { // 建立一個Student類的對象,即學生對象 Student stu1 = new Student(); Student stu2 = new Student(); // 建立一個Student類對象,即Student類的Class對象 Class cls = Student.class; /* * Field屬性操作; */ // 1.擷取Student類中的所有屬性,包含本類和父類中所有public修飾的所有屬性 // Field[] fields = cls.getFields(); // 2.擷取Student類中的所有屬性,包含本類中的任意修飾符修飾的所有屬性 Field[] fields = cls.getDeclaredFields(); for (Field f : fields) { System.out.println(f.getName()); // System.out.println(f.toString()); } System.out.println("**********************\n"); // 3.擷取Student類中指定的屬性 Field name = cls.getField("name"); Field grade = cls.getDeclaredField("grade"); Field sex = cls.getSuperclass().getDeclaredField("sex"); // 為屬性賦值 // stu1.name="tom";//直接通過對象名.屬性名稱賦值 name.set(stu1, "alice");// 為指定對象的屬性賦值 System.out.println("stu1的name:" + name.get(stu1)); // 設定屬性為可訪問,即設定存取修飾詞 grade.setAccessible(true); grade.set(stu1, 2);// 為stu1的私人屬性grade賦值 System.out.println("stu1的grade:" + grade.get(stu1)); System.out.println("*****************************************\n"); /* * Method方法操作 */ // 1.擷取Student類中所有的方法 //Method[] methods = cls.getMethods(); Method[] methods=cls.getDeclaredMethods(); for (Method m : methods) { System.out.println(m.getName()); } // 2.擷取Student類中指定的方法 //stu1.calc(10, 25); Class[] args1={int.class,double.class}; Method calc=cls.getMethod("calc", args1); Object[] args2={10,25.4}; double sum=(Double) calc.invoke(stu1, args2); System.out.println("兩數之和為:"+sum); //擷取private修飾的方法 Method show=cls.getDeclaredMethod("show"); show.setAccessible(true);//不檢測存取修飾詞 show.invoke(stu2);//調用方法 }}/* * Person類 */class Person { public String name; int age; private String sex; protected double height;}/* * Student類,繼承自Person */class Student extends Person { public int id;// 學號 private int grade;// 年級編號 String className;// 班級名稱 public Student(){ } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public int calc(int num1, int num2) { return num1 + num2; } public double calc(int num1, double num2) { return num1 + num2; } private void show(){ System.out.println("第六排右數第二個人有點22222"); }}
JAVA學習筆記(六十一)- 反射Reflection