A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

Java的反射机制是一种可以在程序运行过程中动态的获取某个类的内部结构的机制。
下面通过一个程序来获取任意类的内部结构,下面的代码参考自《Java核心技术:卷I》5.7 反射,
希望对大家理解反射的作用有帮助:
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Modifier;
  5. import java.util.Scanner;

  6. /*
  7. * 通过反射机制获取任意一个类的内部结构
  8. */
  9. public class ReflectionDemo {
  10.         public static void main(String[] args) throws ClassNotFoundException {
  11.                 // 通过用户输入获取类的名称:注意类的名称包括包名加类名
  12.                 String name;
  13.                 {
  14.                         Scanner sc = new Scanner(System.in);
  15.                         System.out.println("请输入一个类名(例如:java.lang.Object) : ");
  16.                         name = sc.nextLine();
  17.                 }

  18.                 // 获取类的Class类对象
  19.                 Class clazz = Class.forName(name);
  20.                 // 获取父类的Class对象
  21.                 Class superClass = clazz.getSuperclass();
  22.                 // 获取类的修饰符
  23.                 String modifiers = Modifier.toString(clazz.getModifiers());

  24.                 //按定义类的格式输出
  25.                 if (modifiers.length() > 0) {
  26.                         System.out.print(modifiers + " ");
  27.                 }
  28.                 System.out.print("class " + name);
  29.                 if (superClass != null && superClass != Object.class) {
  30.                         System.out.print(" extends " + superClass.getName());
  31.                 }
  32.                 System.out.print(" {\n");
  33.                 //打印所有构造方法
  34.                 printConstructors(clazz);
  35.                 System.out.println();
  36.                 //打印所有成员方法,静态方法
  37.                 printMethods(clazz);
  38.                 System.out.println();
  39.                 //打印所有成员变量,静态变量
  40.                 printFields(clazz);
  41.                 System.out.println("}");
  42.         }
  43.        
  44.         public static void printConstructors(Class cl) {
  45.                 Constructor[] constructors = cl.getDeclaredConstructors();
  46.                
  47.                 for (Constructor constructor : constructors) {
  48.                         //获取构造方法修饰符
  49.                         String modifiers = Modifier.toString(constructor.getModifiers());
  50.                         //获取构造方法名称
  51.                         String name = constructor.getName();
  52.                         //获取构造方法参数列表
  53.                         Class[] types = constructor.getParameterTypes();

  54.                         //按格式打印方法
  55.                         System.out.print("\t");
  56.                         if(modifiers.length() > 0) {
  57.                                 System.out.print(modifiers + " ");
  58.                         }
  59.                         System.out.print(name + "(");
  60.                         for (int i = 0; i < types.length; i++) {
  61.                                 if(i > 0) {
  62.                                         System.out.print(", ");
  63.                                 }
  64.                                 System.out.print(types[i].getName());
  65.                         }
  66.                         System.out.println(");");
  67.                 }
  68.         }
  69.        
  70.         public static void printMethods(Class cl) {
  71.                 //获取方法
  72.                 Method[] methods = cl.getDeclaredMethods();
  73.                 for (Method method : methods) {
  74.                         //获取方法名
  75.                         String name = method.getName();
  76.                         //获取修饰符
  77.                         String modifiers = Modifier.toString(method.getModifiers());
  78.                         //获取方法参数列表
  79.                         Class[] types = method.getParameterTypes();
  80.                        
  81.                         //按格式打印
  82.                         System.out.print("\t");
  83.                         if(modifiers.length() > 0) {
  84.                                 System.out.print(modifiers + " ");
  85.                         }
  86.                         System.out.print(name + "(");
  87.                         for (int i = 0; i < types.length; i++) {
  88.                                 if(i > 0) {
  89.                                         System.out.print(", ");
  90.                                 }
  91.                                 System.out.print(types[i].getName());
  92.                         }
  93.                         System.out.println(");");
  94.                 }
  95.                
  96.         }
  97.        
  98.         public static void printFields(Class cl) {
  99.                 Field[] fields = cl.getDeclaredFields();
  100.                 for (Field field : fields) {
  101.                         //获取变量名
  102.                         String name = field.getName();
  103.                         //获取修饰符
  104.                         String modifiers = Modifier.toString(field.getModifiers());
  105.                         //获取类型
  106.                         Class type = field.getType();
  107.                        
  108.                         //按格式打印
  109.                         System.out.print("\t");
  110.                         if(modifiers.length() > 0) {
  111.                                 System.out.print(modifiers + " ");
  112.                         }
  113.                         System.out.println(type.getName() + " " + name + ";");
  114.                 }
  115.         }
  116. }
复制代码
假设输入:java.util.Collection
运行结果:
请输入一个类名(例如:java.lang.Object) :
java.util.Collection
public abstract interface class java.util.Collection {

        public abstract hashCode();
        public abstract equals(java.lang.Object);
        public abstract add(java.lang.Object);
        public abstract contains(java.lang.Object);
        public abstract isEmpty();
        public abstract size();
        public abstract toArray([Ljava.lang.Object;);
        public abstract toArray();
        public abstract addAll(java.util.Collection);
        public abstract iterator();
        public abstract remove(java.lang.Object);
        public abstract clear();
        public abstract containsAll(java.util.Collection);
        public abstract removeAll(java.util.Collection);
        public abstract retainAll(java.util.Collection);

}


1 个回复

倒序浏览
学习了~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马