zoukankan      html  css  js  c++  java
  • 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("
    
    }");
     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
    

      

  • 相关阅读:
    程序员最怕的事
    钱钟书是怎样做读书笔记的 杨绛
    编码风格不是编码规范
    Google Reader明日关闭:14款替代品对比
    移动应用设计领域中最拔尖的15大应用
    TOGAF:企业信息化复杂吗?
    敏捷个人回顾以及体系2014版线下分享活动
    敏捷个人手机应用iOS和Android公开注册
    IT人的自我导向型学习:学习的4个层次
    IT人的自我导向型学习:学习的3个维度
  • 原文地址:https://www.cnblogs.com/gousheng107/p/7825226.html
Copyright © 2011-2022 走看看