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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM