java反射機(jī)制小結(jié)

本文主要從以下幾個(gè)方面對(duì)java反射機(jī)制進(jìn)行總結(jié):

1. 反射的概念
2.反射的作用
3.反射主要類(lèi)說(shuō)明
4.反射實(shí)例

反射的概念

java反射機(jī)制是在運(yùn)行狀態(tài)中,能夠知道任意類(lèi)下的所有方法和屬性,能夠調(diào)用任意對(duì)象的方法和屬性。這種能動(dòng)態(tài)獲取方法和屬性并調(diào)用的機(jī)制稱反射機(jī)制。

反射的作用

在日常開(kāi)發(fā)中,有時(shí)需要獲取并調(diào)用第三方平臺(tái)的某個(gè)方法或?qū)傩?。而這些方法和屬性往往只對(duì)系統(tǒng)應(yīng)用或某些類(lèi)開(kāi)放,這時(shí)需要使用反射技術(shù)來(lái)解決。當(dāng)然不是所有對(duì)象都能反射成功,比如被反射對(duì)象做了訪問(wèn)權(quán)限校驗(yàn)。

反射主要類(lèi)

Class類(lèi)
getDeclaredMethods() 獲取類(lèi)的所有公有和私有方法
getMethod(String name, 類(lèi)<?>... parameterTypes) 根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有方法
getMethods() 獲取類(lèi)的所有公有方法
getEnclosingMethod() 獲取定義該類(lèi)的公有方法
getDeclaredMethod(Stringname, 類(lèi)<?>... parameterTypes)根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有或私有方法
getConstructor(類(lèi)<?>... parameterTypes) 根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有構(gòu)造方法
getConstructors() 獲取類(lèi)的所有公有構(gòu)造方法
getDeclaredConstructor(類(lèi)<?>... parameterTypes) 根據(jù)給定參數(shù)類(lèi)型去匹配獲取類(lèi)的某個(gè)公有或私有構(gòu)造方法
getDeclaredConstructors() 根據(jù)獲取類(lèi)的全部公有或私有構(gòu)造方法
getEnclosingConstructor() 獲取定義該類(lèi)的公有構(gòu)造方法
getDeclaredField(String name) 獲取指定名稱的公有或私有屬性;
getDeclaredFields() 獲取所有屬性
getField(String name) 獲取指定名稱的公有屬性
getFields() 獲取所有公有屬性

Constructor類(lèi)
newInstance(Object... initargs) 根究指定的參數(shù)找到對(duì)應(yīng)的構(gòu)造函數(shù)并實(shí)例出對(duì)象

Field類(lèi)
getName() 返回由此 Field對(duì)象表示的字段的名稱
set(Object obj, Object value) 將指定對(duì)象參數(shù)上的此 Field對(duì)象表示的字段設(shè)置為指定的新值。
get(Object obj) obj表示某個(gè)對(duì)象,返回指定對(duì)象的此Field的值

Method類(lèi)
invoke(Object obj, Object... args) 。obj表示被調(diào)用方法的某個(gè)對(duì)象,args表示調(diào)用此方法需要的參數(shù)。調(diào)用某個(gè)對(duì)象的Method對(duì)象所表示的方法。

反射實(shí)例

被反射的類(lèi)

public class Book{

private final static StringTAG ="BookTag";

    private Stringname;

    private Stringauthor;

    public Objectb;

    @Override

    public String toString() {

       return "Book{" +"name='" +name +'\'' +", author='" +author +'\'' +'}';

    }

      public Book(){ }

      public Book(String name, String author) {

        this.name = name;

        this.author = author;

        class a{

            String c;

            String d;

            public a(){}

            public a(String a, String b){

                c = a;
                d = b;

            }

            @Override

            public StringtoString() {

                   return c +"----" +d;

            }

        }

        b =new a();

    }

      public String getName() {

              return name;

      }

     public void setName(String name) {

            this.name = name;

    }

     public StringgetAuthor() {

          return author;

    }

   public void setAuthor(String author) {

         this.author = author;

    }

   private String declaredMethod(String index) {

         String string =null;

        switch (index) {

                 case "0":

                   string ="I am declaredMethod 1 !";

                break;

              case "1":

                 string ="I am declaredMethod 2 !";

              break;

            default:

         string ="I am declaredMethod 1 !";

      }

         return string;

  }

}

反射類(lèi)

public class ReflexClass {

private final static StringTAG ="peter.log.ReflectClass";

    // 創(chuàng)建對(duì)象

    public static void reflectNewInstance() {

          try {

             Class classBook = Class.forName("com.reflex.Book");//初始化類(lèi)對(duì)象

            Object objectBook = classBook.newInstance();//創(chuàng)建一個(gè)實(shí)例

            Book book = (Book) objectBook;

            book.setName("Android進(jìn)階之光");

            book.setAuthor("劉望舒");

            System.out.println(book.toString());

        }catch (Exception ex) {

             ex.printStackTrace();

        }

}

public static void main(String[] a){

          ReflexClass.reflectEnclosingConstructor();

//        ReflexClass.reflectPrivateField();

    }

// 反射私有的構(gòu)造方法

    public static void reflectPrivateConstructor() {

          try {

             Class classBook = Class.forName("com.reflex.Book");

            //獲取一個(gè)參數(shù)個(gè)數(shù)為2,參數(shù)類(lèi)型均為String類(lèi)型的構(gòu)造函數(shù)

            Constructor declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);

            declaredConstructorBook.setAccessible(true);//TRUE表示禁止java語(yǔ)言訪問(wèn)器檢查訪問(wèn)

//使用構(gòu)造函數(shù)對(duì)象生成實(shí)例

            Object objectBook = declaredConstructorBook.newInstance("Android進(jìn)階之光","test");

            Book book = (Book) objectBook;

            System.out.println(book.toString());

        }catch (Exception ex) {

              ex.printStackTrace();

        }

}

// 反射定義內(nèi)部類(lèi)的構(gòu)造方法

    public static void reflectEnclosingConstructor() {

           try {

            Class classBook = Class.forName("com.reflex.Book");

            Class cls = ((Book)classBook.getDeclaredConstructor(String.class,String.class)

.newInstance("Android進(jìn)階之光","test")).b.getClass();

            //獲取一個(gè)參數(shù)個(gè)數(shù)為2,參數(shù)類(lèi)型均為String類(lèi)型的構(gòu)造函數(shù)

            Constructor declaredConstructorBook = cls.getEnclosingConstructor();

            declaredConstructorBook.setAccessible(true);//TRUE表示禁止java語(yǔ)言訪問(wèn)器檢查訪問(wèn)

//使用構(gòu)造函數(shù)對(duì)象生成實(shí)例

            Object objectBook = declaredConstructorBook.newInstance("Android進(jìn)階之光","test1");

            Book book = (Book) objectBook;

            System.out.println(book.toString());

        }catch (Exception ex) {

             ex.printStackTrace();

        }

}

// 反射私有屬性

    public static void reflectPrivateField() {

          try {

            Class classBook = Class.forName("com.reflex.Book");

            Object objectBook = classBook.newInstance();

            Field fieldTag = classBook.getDeclaredField("TAG");//獲取指定名稱的屬性

            fieldTag.setAccessible(true);

            String tag = (String) fieldTag.get(objectBook);//獲取一個(gè)指定實(shí)例的屬性

            System.out.println(fieldTag.getModifiers());

        }catch (Exception ex) {

             ex.printStackTrace();

        }

}

// 反射私有方法

    public static void reflectPrivateMethod() {

           try {

             Class classBook = Class.forName("com.reflex.Book");

            //根據(jù)方法名和方法參數(shù)的類(lèi)名生成方法對(duì)象

            Method methodBook = classBook.getDeclaredMethod("declaredMethod",String.class);

            methodBook.setAccessible(true);

            Object objectBook = classBook.newInstance();//生成一個(gè)對(duì)象

            String string = (String) methodBook.invoke(objectBook,"0");//根據(jù)實(shí)例和參數(shù)調(diào)用方法獲取返回值

            System.out.println(string);

        }catch (Exception ex) {

            ex.printStackTrace();

        }

}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容