1. 程式人生 > 實用技巧 >java學習筆記之反射—Class類例項化和物件的反射例項化

java學習筆記之反射—Class類例項化和物件的反射例項化

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學習筆記之反射—反射和工廠模式