成功測試java反射機制

在Android開發的過程中,發現一些系統的方法無法調用,知道利用反射機制可以實現調用,今天測試成功java的反射機制,在此mark一下。

 直接上代碼

package thinking.java.example_c11;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

//: ShowMethod.java
//Using Java 1.1 reflection to show all the
//methods of a class, even if the methods are
//defined in the base class

public class ShowMethod {
    static final String usage =
        "usage: /n" +
        "ShowMethods qualified.class.name/n" +
        "To show all methods in class or: /n" +
        "ShowMethods qualified.class.name word/n" +
        "To search for methods involving 'word'";

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(args));
    if(args.length < 1) {
            System.out.println(usage);
            System.exit(0);
        }
    try {
            Class c = Class.forName(args[0]);
           
            Class[] parameterTypes = new Class[1];
            parameterTypes[0] = char[].class;
            try {
                Method tt = c.getMethod("valueOf", parameterTypes);
                char[] pp = {'a','b','c','d'};
                try {
                    String back = (String)tt.invoke(c.newInstance(), pp);
                    System.out.println("反射調用方法valueOf(char[])返回String: "+back);
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
            Method[] m = c.getMethods();
            Constructor[] ctor = c.getConstructors();
            if(args.length == 1) {
                for (int i = 0; i < m.length; i++)
                    System.out.println(m[i].toString());
                for (int i = 0; i < ctor.length; i++)
                    System.out.println(ctor[i].toString());
            }
            else {
                for (int i = 0; i < m.length; i++)
                    if(m[i].toString()
                            .indexOf(args[1])!= -1)
                System.out.println(m[i].toString());
                for (int i = 0; i < ctor.length; i++)
                    if(ctor[i].toString()
                            .indexOf(args[1])!= -1)
                System.out.println(ctor[i].toString());
        }
        } catch (ClassNotFoundException e) {
                System.out.println("No such class: " + e);
        }
   
    }
       
}

例子的執行需要注意下:

1.如果不是在eclipse環境下,而是在命令行執行,則需要注意編譯出來的ShowMethod.class與執行路徑的關係。

需要在工程的bin目錄下執行,我的即是:/work/workspace/th-java/bin

我的class文件的位置是:/work/workspace/th-java/bin/thinking/java/example_c11

2.如果是在eclipse中執行。 則在run Configuration ->Arguments 中配置參數 java.lang.String。


部分運行結果:

[java.lang.String]
反射調用方法valueOf(char[])返回String: abcd
public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(int)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(java.lang.String)

。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章