zoukankan      html  css  js  c++  java
  • 细说反射API

    有时候需要知道比Class类所提供的信息多得多的有关一个类型的信息。出于这种目的,可以使用程序包java.lang.reflect中的类,换句话说就是所说的反射API。这个类集提高了Class类的能力和有效性。

    反射API支持一种名为自省的行为,这种行为实际上使一个类描述自身。

    反射API使对象具有反射自己和发现自身内容的能力。程序包java.lang.reflect定义了很多类,这些类总体上对一个对象作了完整的描述。

    下面给出了这3种类表示类的构建块:
    (1)Constructor类的每个实例都提供了关于一个类的一个构造函数的信息,并且为调用程序提供了使用这个构造函数以创建一个对象的方式。
    (2)Method类的每个实例都提供了关于一个类的一种方法的信息,并且为调用程序提供了调用这种方法的方式。这种方法可能是类的方法或者实例的方法,而且可能是抽象的。
    (3)Field类的每个实例都提供了关于一个类的一个域的信息,并且为调用程序提供了获得和设置这个域的值的方法。这个域可以是类变量或者实例变量。

    下面用一个例子帮助大家了解:

      
      1import java.lang.reflect.*;
      2
      3public class ReflectionDemo
      4{
      5    public static void main(String[] args)
      6    {
      7        try
      8        {
      9            ReflectionDemo demo = new ReflectionDemo();
     10
     11            Method myMethod;
     12            Class[] parameterTypes;
     13            Object[] parameters;
     14            Object result;
     15
     16            TestClass testObj = new TestClass();
     17            Class myClass = testObj.getClass();
     18
     19            System.out.println("Methods defined in class " + myClass.getName());
     20            demo.printMethods(myClass);
     21            System.out.println();
     22
     23            //input parameter types for method
     24            parameterTypes = new Class[]{int.class, String.class};
     25
     26            //input parameter for method
     27            parameters = new Object[] {new Integer(2), "this is test"};
     28
     29            //get method by name and parameter types
     30            myMethod = myClass.getMethod("test1", parameterTypes);
     31
     32            //run it
     33            System.out.println(myMethod.getName());
     34            result = demo.execute(testObj, myMethod, parameters);
     35            System.out.println("Returned value: " + result);
     36
     37            //input parameter types for method
     38            parameterTypes = new Class[] {int[].class};
     39
     40            //input parameters for method
     41            int[] nums = {12345};
     42            parameters = new Object[] {nums};
     43
     44            //get method by name parameter types
     45            myMethod = myClass.getMethod("test2", parameterTypes);
     46
     47            //run it
     48            System.out.println(myMethod.getName());
     49            result = demo.execute(testObj, myMethod, parameters);
     50            System.out.println("Result value: " + result);
     51
     52            //input parameter types for method
     53            parameterTypes = new Class[] {};
     54
     55            //input parameters for method
     56            parameters = new Object[] {};
     57            myMethod = myClass.getMethod("test3", parameterTypes);
     58
     59            //run it
     60            System.out.println(myMethod.getName());
     61            result = demo.execute(testObj, myMethod, parameters);
     62            System.out.println("Returned value: " + result);
     63        }

     64        catch(Exception e)
     65        {
     66            System.out.println(e);
     67        }

     68    }

     69
     70    //print out definition of declared methods
     71    public void printMethods(Class aClass)
     72    {
     73        Method[] ms = aClass.getDeclaredMethods();
     74        for(int i = 0; i < ms.length; i ++)
     75        {
     76            System.out.println(ms[i].toString());
     77        }

     78    }

     79
     80    //execute method of an object with given parameters
     81    public Object execute(Object classObject, Method myMethod, Object[] parameters) throws Exception
     82    {
     83        String errorMsg;
     84
     85        try
     86        {
     87            //run the method
     88            return myMethod.invoke(classObject, parameters);
     89        }

     90        catch(InvocationTargetException invokeE)
     91        {
     92            //catch exception thrown by the invoked method
     93            errorMsg = invokeE.getTargetException().getMessage();
     94        }

     95
     96        throw new Exception(errorMsg);
     97
     98    }

     99}

    100
    101class TestClass
    102{
    103    public void test1(int i, String str)
    104    {
    105        System.out.println("1 = " + i + " and " + "str = \"" + str + "\"");
    106    }

    107
    108    public int test2(int[] nums)
    109    {
    110        int sum = 0;
    111        for(int i = 0; i < nums.length; i ++)
    112            sum += nums[i];
    113
    114        return sum;
    115    }

    116
    117    public String test3()
    118    {
    119        return "\"No input parameter\"";
    120    }

    121}

    122
    123
    124


    结果如下:
    Methods defined in class TestClass
    public void TestClass.test1(int,java.lang.String)
    public int TestClass.test2(int[])
    public java.lang.String TestClass.test3()

    test1
    1 = 2 and str = "this is test"
    Returned value: null
    test2
    Result value: 15
    test3
    Returned value: "No input parameter"

  • 相关阅读:
    bootstrap-select用法详解
    启动react项目报如下错误
    什么?女朋友生气哄不好?那是你没有这款神器!
    Python竟然能做这种进度条,看完别说WC!
    看完学习Python的萌新都在问的六个问题,你就可以毕业了!
    批量加水印防抄袭,Python轻松搞定!
    hdu_1272_小希的迷宫_201403091527
    hdu_1856_More is better_201403091720
    hdu_1213_How Many Tables_201403091126
    hdu_1232_畅通工程_201403091018
  • 原文地址:https://www.cnblogs.com/bankey/p/357853.html
Copyright © 2011-2022 走看看