java反射

概述

在android中很多開源框架都用到了反射,比如eventbus等,掌握好反射對以後進行更深層的開發是大有好處的。
Java反射機制主要提供了以下功能:

  • 在運行時判斷任意一個對象所屬的類;
  • 在運行時構造任意一個類的對象;
  • 在運行時判斷任意一個類所具有的成員變量和方法;
  • 在運行時調用任意一個對象的方法。

即在運行狀態時,對於任何一個類,都可以獲取這個類的所有屬性和方法。

使用

先看一個非常簡單的例子,只有倆個類
Number.java

public class Number {

    public int add(int parm1, int parm2) {
        return parm1 + parm2;
    }

    public String echo(String message) {
        return "hello:" + message;
    }

}

在ReflectTest.java的main方法中通常這樣就可使用Number類了

        Number number = new Number();
        System.out.println(number.add(3, 8));
        System.out.println(number.echo("java reflect"));

這裏要使用反射的方式如何去做?首先要獲得對應對象的Class對象,下面將詳細看看如何獲得對象。
獲取某個類或對象所對應的Class對象的3種方式:

  • 使用Class類的靜態方法forName,如Class.forName(“java.lang.String”);
  • 使用.class語法,如String.class;
  • 使用對象的getClass方法,如
String s = "abc"; Class<?> classType = s.getClass();

若想通過類的不帶參數的構造方法來生成對象,我們有兩種方式:
1)先獲得Class對象,然後通過該Class對象的newInstance方法直接獲得即可。如

Class<?> classType = String.class; 
Object o = classType.newInstance();

2)先獲得Class對象,然後通過該Class對象獲得所對應的Constructor對象,再通過該Constructor對象的newInstance方法生成。如

Class<?> classType = Customer.class;
Constructor constructor  =classType.getConstructor(new Class[]{});
Object o1 = constructor.newInstance(new Object[]{});

若想通過類的帶參數的構造方法來生成對象,只能使用下面這種方式:

Class<?> classType = Customer.class;
Constructor constructor2  = classType.getConstructor(new Class[]{String.class,int.class});
Object o2 = constructor.newInstance(new Object[]{"張三",20});

在這裏,我們使用反射來獲取Number的方法

public class ReflecTest {

    public static void main(String[] args) throws Exception {
        /*Number number = new Number();
        System.out.println(number.add(3, 8));
        System.out.println(number.echo("java reflect"));*/

        //使用反射
        Class<?> clazz = Number.class;
        //通過反射生成一個Number類型對象
        Object obj = clazz.newInstance();

        //通過反射獲取到add方法
        Method addMethod = clazz.getMethod("add", new Class[]{int.class,int.class});
        //調用對象的add方法將參數傳入到add方法中
        System.out.println(addMethod.invoke(obj, new Object[]{3,8}));

        //通過反射獲取echo方法
        Method echoMethod = clazz.getMethod("echo", new Class[]{String.class});
        System.out.println(echoMethod.invoke(obj, new Object[]{"java reflect"}));
    }

}

demo下載傳送門
參考文章:

http://blog.csdn.net/bear_huangzhen/article/details/28314293
http://blog.csdn.net/furongkang/article/details/6966400

發佈了170 篇原創文章 · 獲贊 143 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章