通过Class类的getMethods()方法、getDeclaredMethods()方法、getMethod(String name, Class[] args)方法和getDeclaredMethod(String name, Class[] args)等方法,程序员可以获得对应类的特定方法组或方法,返回值为Method对象数组或Method对象。接下来,通过一个案例来演示如何详细获取一个类的所有方法的信息(方法名、参数列表和异常列表)。

      为了使程序输出的内容不要太多,所以选择了仅有两个方法的org.w3c.dom.NodeList接口,演示如何获取方法信息。案例中使用了Method类的getName()、getDeclaringClass()、getParameterTypes()、getExceptionTypes()、getReturnType()方法,作用分别为获得方法名称、方法所在的类或接口名,方法的参数列表,方法的异常列表以及方法的返回值类型。

      程序运行结果如图5.4所示,因为NodeList接口的两个方法都没有必须要捕获的异常,所以程序运行结果中没有显示出异常列表的内容。


    图5.4 获取类方法详细信息

      接下来在上面案例的基础上,说明Class类的getDeclaredMethods()方法和getMethods()方法的区别。先创建Sub和Super两个类,其中Sub是继承自Super的子类,每个类中都有四种不同访问权限的方法,具体代码如下:

      修改TestMethod类代码,将装入类从org.w3c.dom.NodeList改为Sub,运行程序,观察Sub类的Class对象调用getDeclaredMethods()方法,获得了Sub类的哪些方法。程序运行结果如图5.5所示。

    5.4 获取类信息 - 图2


      从运行结果可以看出,Class类的getDeclaredMethods()方法获得了Class所表示的Sub类的全部私有、默认、受保护和公有的方法,但不包括继承的方法(如果Super类和Sub类在同一个Java源文件中进行编译,显示的结果会包括父类公有的方法)。若将TestMethod代码中的getDeclaredMethods()方法再改为getMethods(),则程序运行结果如图5.6所示。


    图5.6 getMethods()方法获得的方法

      从运行结果(输出内容较多,仅截选了部分内容)可以看出,Class类的getMethods()方法获得了Class所表示的Sub类及其父类所有的公共方法。

      通过上一小节的学习,已经获得Class类的方法数组,并通过操作这些方法数组里的Method对象,获取方法的详细信息。一个类除了有方法外,剩下最重要的部分应该就是属性了。接下来通过一个案例来演示如何获取Sub类的相关属性。

      案例中使用了Field类的getType()方法获取属性的类型,getName()方法获取属性名、getDeclaringClass()方法获取属性所在的类或接口名称,getModifiers()方法获取以整数形式返回由此Field对象表示的属性的Java访问权限修饰符(值为m),并通过Modifier.toString(m)获取Java访问权限修饰符字符串结果。

      程序运行结果如图5.7所示。注意程序中首先使用了getDeclaredField(name)方法获取了指定属性名的属性对象。获取Sub类属性的方法是getDeclaredFields(),返回的是Sub类的全部属性(不含继承的属性)。如果想获得Sub类所有公共属性,则需要调用getFields()方法。将程序中getDeclaredFields()方法改为getFields(),再次编译运行。程序运行结果如图5.8所示。

    5.4 获取类信息 - 图4



    图5.8 getFields()方法获得的属性

      通过Class类,可以获得属性和方法,但是getDeclaredMethods()和getMethods()等获取方法的方法只能获得普通方法,不能获得类的构造方法。接下来,通过Class类的getConstructors()方法和 getDeclaredConstructors()方法,可以获得对应类的构造方法,返回值为Constructor对象数组。下面首先改造Sub类,具体代码如下:

      Sub类仍然继承Super类,每个类中都有一个无参构造方法和四个具有不同访问权限的有参构造方法。通过Class类获取构造方法的代码如下:

      分别调用Sub类所属Class的getDeclaredConstructors()和getConstructors()方法,运行结果如图5.9和图5.10所示。其中getDeclaredConstructors()方法得到了Sub类里声明的全部五个构造方法,而getConstructors()方法得到了Sub类里声明的两个公有的构造方法。

    5.4 获取类信息 - 图6


    图5.9 getDeclaredConstructors()方法获得的构造方法