
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(" }"); 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 }
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