java學習筆記之反射—Class類例項化和物件的反射例項化
阿新 • • 發佈:2020-07-29
java學習筆記之反射—Class類例項化和物件的反射例項化
反射之中所有的核心操作都是通過Class類物件展開的,可以說Class類是反射操作的根源所在,但是這個類的例項化物件,
可以採用三種方式完成。
java.lang.Class類的定義:
public final class Class<T> extends Object implements Serializable, GenericDeclaration, Type, AnnotatedElement, TypeDescriptor.OfField<Class<?>>, Constable
1.Object類支援:
Object類可以根據例項化物件獲取Class物件:public final Class<?> getClass()
這種方式有一個缺點:如果現在只是想獲得Class類物件,則必須產生指定類物件後才可以獲得,會造成一個無用的物件產生
程式碼:
Person per = new Person();//已經存在有指定類的例項化物件 Class<? extends Person> cls = per.getClass();
2.JVM直接支援:
採用“類.class”的形式例項化
程式碼:
Class<? extends Person> cls2 = Person.class;
3.Class類支援:
在Class類裡面提供有一個static方法:
- 載入類:public static Class<?> forName(String className) throws ClassNotFoundException
這種模式最大的特點是可以直接採用字串的形式定義要使用的型別,並且程式不需要編寫任何的import程式
注意:使用該方法時引數必須是完整類名,如以下程式碼中IOtest為包名,InputUtil是類名
Class<?> cls3 = Class.forName("IOtest.InputUtil");
完整程式碼:
package Reflect; public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub // 1、Object類支援 Person per = new Person();//已經存在有指定類的例項化物件 Class<? extends Person> cls = per.getClass(); System.out.println(per); System.out.println(cls.getName());//獲取的是類的完整名稱 // 2、JVM直接支援 Class<? extends Person> cls2 = Person.class; System.out.println(cls2.getName()); // 3、Class類支援 Class<?> cls3 = Class.forName("IOtest.InputUtil");//不需要用import匯入IOtest包 System.out.println(cls3.getName()); } } class Person{}
獲取Class物件之後最大的意義實際上並不是在於這是一個物件,更重要的是Class類裡面提供有一個物件的
反射例項化方法(代替了關鍵字new):
在jdk1.9以前的例項化:public T newInstance() throws InstantiationException,IllegalAccessException
jdk1.9之後:clazz.getDeclaredConstructor().newInstance()
通過反射實現的物件例項化處理,依然要呼叫類中的無參構造方法,其本質等價於“類 物件 = new 類()”,也就是說相當於隱藏了關鍵
字new,而直接使用字串進行了替代
程式碼例項:
/* * 通過newInstance()方法例項化Student類物件 */ package Reflect; public class ReflectDemo2 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Class<?> cls = Class.forName("mldn.Student"); Object obj = cls.newInstance();//例項化物件,jdk1.9後被廢除 System.out.println(obj); //jdk1.9之後:被clazz.getDeclaredConstructor().newInstance()替代 Object o = cls.getDeclaredConstructor().newInstance(); System.out.println(o); } }分類:java學習 «上一篇:java學習筆記之IO程式設計—物件序列化
»下一篇:java學習筆記之反射—反射和工廠模式