Java核心技术卷I程序清单5-13

P195
程序清单5-13 reflection/Reflection Test.java


  1. 代码
  2. 重要API

1.代码

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

public class ReflectionTest
{
   public static void main(String[] args)
   {
      // read class name from command line args or user input
      String name;
      if (args.length > 0) name = args[0];
      else
      {
         Scanner in = new Scanner(System.in);
         System.out.println("Enter class name (e.g. java.util.Date): ");
         name = in.next();
      }

      try
      {
         // print class name and superclass name (if != Object)
         Class cl = Class.forName(name);
         Class supercl = cl.getSuperclass();

    //获取cl的访问权限修饰符(public,private等)
         String modifiers = Modifier.toString(cl.getModifiers());
         if (modifiers.length() > 0) System.out.print(modifiers + " ");
         System.out.print("class " + name);
         if (supercl != null && supercl != Object.class) System.out.print(" extends "
               + supercl.getName());

         System.out.print("\n{\n");

         //打印构造方法
         printConstructors(cl);
         System.out.println();

         //打印成员方法
         printMethods(cl);
         System.out.println();

         //打印域(成员变量)
         printFields(cl);
         System.out.println("}");
      }
      catch (ClassNotFoundException e)
      {
         e.printStackTrace();
      }
      System.exit(0);
   }

   /**
    * Prints all constructors of a class
    * @param cl a class
    */
   public static void printConstructors(Class cl)
   {
      Constructor[] constructors = cl.getDeclaredConstructors();

      for (Constructor c : constructors)
      {
         String name = c.getName();
         System.out.print("   ");

         String modifiers = Modifier.toString(c.getModifiers());
         if (modifiers.length() > 0) System.out.print(modifiers + " ");
         System.out.print(name + "(");

         // print parameter types
         Class[] paramTypes = c.getParameterTypes();
         for (int j = 0; j < paramTypes.length; j++)
         {
            if (j > 0) System.out.print(", ");
            System.out.print(paramTypes[j].getName());
         }
         System.out.println(");");
      }
   }

   /**
    * Prints all methods of a class
    * @param cl a class
    */
   public static void printMethods(Class cl)
   {
      Method[] methods = cl.getDeclaredMethods();

      for (Method m : methods)
      {
         Class retType = m.getReturnType();
         String name = m.getName();

         System.out.print("   ");
         // print modifiers, return type and method name
         String modifiers = Modifier.toString(m.getModifiers());
         if (modifiers.length() > 0) System.out.print(modifiers + " ");
         System.out.print(retType.getName() + " " + name + "(");

         // print parameter types
         Class[] paramTypes = m.getParameterTypes();
         for (int j = 0; j < paramTypes.length; j++)
         {
            if (j > 0) System.out.print(", ");
            System.out.print(paramTypes[j].getName());
         }
         System.out.println(");");
      }
   }

   /**
    * Prints all fields of a class
    * @param cl a class
    */
   public static void printFields(Class cl)
   {
      Field[] fields = cl.getDeclaredFields();

      for (Field f : fields)
      {
         Class type = f.getType();
         String name = f.getName();
         System.out.print("   ");
         String modifiers = Modifier.toString(f.getModifiers());
         if (modifiers.length() > 0) System.out.print(modifiers + " ");
         System.out.println(type.getName() + " " + name + ";");
      }
   }
}

2.重要API

java.lang.Class 1.0


static Class forName(String className)
返回描述类名为className的Class对象。

Object newInstance()
返回这个类的一个新实例。


java.lang.reflect.Constructor 1.1


Object newInstance(Object[] args)
构造一个这个构造器所属类的新实例。其中args是提供给构造器的参数。


java.lang.Class 1.0


Field[] getFields()
Field[] getDeclaredFields()
getFields方法将返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域。getDeclaredField方法也将返回包含Field对象的数组,这些对象记录了这个类的全部域。如果类中没有域,或者Class对象描述的是基本类型或数组类型,这些方法将返回一个长度为0的数组。

Method[] getMethods()
Method[] getDeclaredMethods()
返回包含Method对象的数组:getMethods将返回所有的公有方法包括从超类继承来的公有方法;getDeclaredMethods返回这个类或接口的全部方法,但不包括由超类继承了的方法。

Constructor[] getConstructors()
Constructor[] getDeclaredConstructors()
返回包含Constructor对象的数组,其中包含了Class对象所描述的类的所有公有构造器(getConstructors)或所有构造器(getDeclaredConstructors)。


java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Constructor


Class getDeclaringClass()
返回一个用于描述类中定义的构造器、方法或域的Class对象。

Class[] getExceptionTypes()(在Field类中不适用)
返回一个用于描述方法抛出的异常类型的Class对象数组。

int getModifiers()
返回一个用于描述构造器、方法或域的修饰符的整型数值。使用Modifier类中的这个方法可以分析这个返回值。
使用Modifier.toString(int modifiers)可以通过该整型数值获取对应的修饰符字符串。

String getName()
返回一个用于描述构造器、方法或域的名字的字符串。

Class[] getParameterTypes()(在Field类中不适用)
返回一个用于描述参数类型的Class对象数组。

Class getReturnType()(仅在Mrthod类中)
返回一个用于描述返回类型的Class对象。


java.lang.reflect.Modifier


static String toString(int modifiers)
返回对应modifiers的修饰符的字符串表示。

static boolean isAbstract(int modifiers)
static boolean isFinal(int modifiers)
static boolean isInterface(int modifiers)
static boolean isNative(int modifiers)
static boolean isPrivate(int modifiers)
static boolean isProtected(int modifiers)
static boolean isPublic(int modifiers)
static boolean isStatic(int modifiers)
static boolean isStrict(int modifiers)
static boolean isSynchronized(int modifiers)
static boolean isVolatile(int modifiers)
这些方法将检测方法名中对应的修饰符在modifiers值对应的二进制位串中是否存在。


如有谬误或不完善之处,恳请斧正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值