Java核心技术 卷1 使用反射分析类

  1 package test;
  2 
  3 import java.lang.reflect.Constructor;
  4 import java.lang.reflect.Field;
  5 import java.lang.reflect.Method;
  6 import java.lang.reflect.Modifier;
  7 import java.util.Scanner;
  8 
  9 /**
 10  * Created by Administrator on 2017/11/11.
 11  */
 12 public class ReflectionTest {
 13     public static void main(String[] args) {
 14         String name;
 15         if (args.length>0){
 16             name=args[0];
 17         }
 18         else {
 19             Scanner in =new Scanner(System.in);
 20             System.out.println("Enter class name (e.g java.util.Date):");
 21             name=in.next();
 22         }
 23         try {
 24             //返回描述类名为className(java.lang.Double)的Class对象
 25             Class cl=Class.forName(name);
 26             //返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的
 27             Class supercl=cl.getSuperclass();
 28             //返回此类或接口以整数编码的 Java 语言修饰符
 29             int modifiers1 = cl.getModifiers();
 30             //Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码
 31             //toString()返回描述指定修饰符中的访问修饰符标志的字符串
 32             String modifiers= Modifier.toString(modifiers1);
 33             if(modifiers.length()>0){
 34                 System.out.print(modifiers+" ");
 35             }
 36             System.out.print("class "+name);
 37             if (supercl!=null&&supercl!= Object.class){
 38                 //输出超类的名称
 39                 System.out.println(" extends "+supercl.getName());
 40             }
 41             System.out.println("{");
 42             //打印该类的所有构造参数
 43             printConstructor(cl);
 44             System.out.println();
 45             printMethods(cl);
 46             System.out.println();
 47             printFields(cl);
 48             System.out.println("\n\n}");
 49         } catch (ClassNotFoundException e) {
 50             e.printStackTrace();
 51         }
 52         System.exit(0);
 53     }
 54 
 55     private static void printFields(Class cl) {
 56         // 返回类的Class对象包含的所声明的所有字段
 57         Field[] fields=cl.getDeclaredFields();
 58         for (Field f:fields
 59              ) {
 60             //字段类型
 61             Class type=f.getType();
 62             //字段名称
 63             String name=f.getName();
 64             System.out.println(" ");
 65             //字段修饰符
 66             String modifiers=Modifier.toString(f.getModifiers());
 67             if (modifiers.length()>0){
 68                 System.out.print(modifiers+" ");
 69             }
 70             System.out.print(type.getName()+" "+name+";");
 71         }
 72     }
 73 
 74     private static void printMethods(Class cl) {
 75         //返回Class 对象声明的所有方法,包括公共、保护、默认
 76         Method[] methods=cl.getDeclaredMethods();
 77         for (Method m:methods
 78              ) {
 79             //返回 Method 对象所表示的方法的正式返回类型
 80             Class retType=m.getReturnType();
 81             //方法名称
 82             String name=m.getName();
 83 
 84             System.out.println(" ");
 85             String  modifiers=Modifier.toString(m.getModifiers());
 86             if (modifiers.length()>0){
 87                 System.out.print(modifiers+" ");
 88             }
 89             //输出返回类型名称
 90             System.out.print(retType.getName()+" "+name+"(");
 91             //返回Method 对象所表示的方法的形参类型
 92             Class[] paramTypes=m.getParameterTypes();
 93             for (int j = 0; j <paramTypes.length ; j++) {
 94                 if(j>0){
 95                     System.out.print(",");
 96                 }
 97                 System.out.print(paramTypes[j].getName());
 98             }
 99             System.out.print(");");
100         }
101 
102     }
103 
104     private static void printConstructor(Class cl) {
105         //getDeclaredConstructors()返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
106         Constructor[] constructors=cl.getDeclaredConstructors();
107         for (Constructor c:constructors
108              ) {
109             //构造方法的名称
110             String name=c.getName();
111             System.out.println("  ");
112             String modifiers=Modifier.toString(c.getModifiers());
113             if(modifiers.length()>0){
114                 System.out.print(modifiers+" ");
115             }
116             System.out.print(name+"(");
117             //表示此 Constructor 对象所表示构造方法的形参类型
118             Class[] paramTypes=c.getParameterTypes();
119             for (int j = 0; j <paramTypes.length ; j++) {
120                 if (j>0){
121                     System.out.println(",");
122                 }
123                 //
124                 System.out.print(paramTypes[j].getName());
125             }
126             System.out.print(");");
127         }
128     }
129 }
View Code
JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。
其中,该修饰符是java.lang.reflect.Modifier的静态属性。
对应表如下:
PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048

控制台输出结果:

Enter class name (e.g java.util.Date):
java.lang.Double
public final class java.lang.Double extends java.lang.Number
{
  
public java.lang.Double(double);  
public java.lang.Double(java.lang.String);
 
public boolean equals(java.lang.Object); 
public static java.lang.String toString(double); 
public java.lang.String toString(); 
public int hashCode(); 
public static int hashCode(double); 
public static double min(double,double); 
public static double max(double,double); 
public static native long doubleToRawLongBits(double); 
public static long doubleToLongBits(double); 
public static native double longBitsToDouble(long); 
public volatile int compareTo(java.lang.Object); 
public int compareTo(java.lang.Double); 
public byte byteValue(); 
public short shortValue(); 
public int intValue(); 
public long longValue(); 
public float floatValue(); 
public double doubleValue(); 
public static java.lang.Double valueOf(java.lang.String); 
public static java.lang.Double valueOf(double); 
public static java.lang.String toHexString(double); 
public static int compare(double,double); 
public static boolean isNaN(double); 
public boolean isNaN(); 
public static boolean isFinite(double); 
public static boolean isInfinite(double); 
public boolean isInfinite(); 
public static double sum(double,double); 
public static double parseDouble(java.lang.String);
 
public static final double POSITIVE_INFINITY; 
public static final double NEGATIVE_INFINITY; 
public static final double NaN; 
public static final double MAX_VALUE; 
public static final double MIN_NORMAL; 
public static final double MIN_VALUE; 
public static final int MAX_EXPONENT; 
public static final int MIN_EXPONENT; 
public static final int SIZE; 
public static final int BYTES; 
public static final java.lang.Class TYPE; 
private final double value; 
private static final long serialVersionUID;

}

Process finished with exit code 0

  

posted on 2017-11-13 10:40  罗伯特☆狗剩  阅读(226)  评论(0编辑  收藏  举报

导航