Reflection(反射)是被視為動態語言的關鍵,反射機制允許程式在執行期借助於Reflection API取得任何類別的內部信息,並能直接操作任意對象的內部屬性及方法。載入完類別之後,在堆記憶體的方法區中就產生了一個Class類型的物件 (一個類別只有一個Class物件),這個物件就包含了完整的類別的結構信 息。我們可以透過這個物件看到類別的結構,這個物件就像一面鏡子,透過這個鏡子看到類別的結構,所以我們形象的稱之為反射。
java.lang.Class
:代表一個類別
java.lang.reflect.Method
:代表類別的方法
java.lang.reflect.Field
:代表類別的成員變數
java.lang.reflect.Constructor
:代表類別的建構器
static Class forName(String name)
傳回指定類別名稱name 的Class 物件
Object newInstance()
呼叫無參建構函數,傳回該Class物件的實例
getName()
傳回此Class物件所表示的實體(類別、 介面、陣列類別、基本型別或void)名稱
Class getSuperClass()
傳回目前Class物件的父類別的Class物件
Class [] getInterfaces()
取得目前Class物件的介面
ClassLoader getClassLoader()
傳回該類別的類別載入器
Class getSuperclass()
傳回表示此Class所表示的實體的超類別的Class
#Constructor[] getConstructors()
傳回一個包含某些Constructor物件的陣列
Field[] getDeclaredFields()
傳回Field物件的一個陣列Method
getMethod(String name,Class … paramTypes)
傳回一個Method對象,此物件的形參類型為paramType
public class Person { private String name; private int age; public Person() { System.out.println("Person类被初始化了。。。。。^_^"); } public Person(String name, int age) { 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; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }反射
public class ClassDemo { public static void main(String[] args) throws Exception { // 1. 创建Class对象 //Class<Person> clazz = (Class<Person>) Class.forName("Person"); Class<?> clazz =Class.forName("Person"); // 2. 通过Class对象调用其方法 // 2.1. 通过反射来实例化对象 //Person person = clazz.newInstance(); Object o = clazz.newInstance(); // 此名就相当于 Person p = new Person() // 2.2. 获取类的完整类名称(包名+类名) String name = clazz.getName(); System.out.println(name); // 2.3. 获取类的简单名称,就是类的名称,不含包名 System.out.println(clazz.getSimpleName()); // 2.4. 获取构造器 Constructor<?>[] constructors = clazz.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor.getName()); } // 2.5. 获取字段 Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field.getName()); } // 2.6. 获取方法 Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } } }三、創建Class物件的四種方式
public class Demo { public static void main(String[] args) throws Exception { // 第一种方式:调用Class.forName() Class clazz =Class.forName("java.lang.String"); // 第二种方式:通过类的字节码文件来创建 Class clazz1 = String.class; // 第三种方式:通过调用对象的getClass()方法来创建 String str = new String(); Class clazz2 = str.getClass(); // 第四种:通过类装载器来创建 ClassLoader loader =String.class.getClassLoader(); Class<?> clazz3 =loader.loadClass("java.lang.String"); } }
以上是Java中反射的意義和作用是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!