Java 反射分析类的能力

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012447842/article/details/84954223

主要学习《java核心技术》, 用以记录, 怕以后遗忘。

java.lang.reflect包中有三个类Field,Method, Constructor分别用于描述类的域,方法和构造器。这三个类都有一个叫做getName的方法, 用于放回项目的名称。

优秀博客者: https://blog.csdn.net/sinat_38259539/article/details/71799078

import java.util.*;
import java.lang.reflect.*;

/**
 *  java核心技术  5.7.3 利用反射分析类的能力
 */


public class ReflectionTest {
    public static void main(String[] args)
    {
        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();
            name = "java.lang.Double";
        }

        try{
            Class cl = Class.forName(name);         // 将字符串转化成对象
            Class supercl = cl.getSuperclass();
            String modifiers = Modifier.toString(cl.getModifiers());

            if (modifiers.length() > 0) System.out.println(modifiers + "");
            System.out.println("class " + name);
            if (supercl != null && supercl != Object.class) System.out.println("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);
    }

    /**
     *    打印类的构造器
     * @param cl
     */
    public static void printConstructors(Class cl)
    {
        Constructor[] constructors = cl.getDeclaredConstructors();    // 获取类中声明的构造器

        for(Constructor c: constructors)
        {
            String name = c.getName();
            System.out.print("1 ");
            String modifiers = Modifier.toString(c.getModifiers());   // c.getModifiers 返回一个整型数值, 用不同的位开关描述public和static的使用情况
            if(modifiers.length() > 0) System.out.print(modifiers + " ");

            System.out.print(name + "(");
            Class[] paramTypes = c.getParameterTypes();

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

    }

    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("2  ");
            String modifiers = Modifier.toString(m.getModifiers());

            if(modifiers.length() > 0) System.out.print(modifiers + " ");  //eg:  public 或 public static  d等
            System.out.print(retType.getName() + " " + name + "(");

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

    }

    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("3  ");
            String modifiers = Modifier.toString(f.getModifiers());

            if (modifiers.length() > 0) System.out.print(modifiers + " ");
            System.out.println(type.getName() + " " + name + " ");
        }
    }
}


执行后放回的结果:

"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" "-javaagent:D:\Program 


public final
class java.lang.Double
extends java.lang.Number

{
1 public java.lang.Double(double);
1 public java.lang.Double(java.lang.String);

2  public boolean equals(java.lang.Object);
2  public static java.lang.String toString(double);
2  public java.lang.String toString();
2  public int hashCode();
2  public static int hashCode(double);
2  public static double min(double, double);
2  public static double max(double, double);
2  public static native long doubleToRawLongBits(double);
2  public static long doubleToLongBits(double);
2  public static native double longBitsToDouble(long);
2  public volatile int compareTo(java.lang.Object);
2  public int compareTo(java.lang.Double);
2  public byte byteValue();
2  public short shortValue();
2  public int intValue();
2  public long longValue();
2  public float floatValue();
2  public double doubleValue();
2  public static java.lang.Double valueOf(java.lang.String);
2  public static java.lang.Double valueOf(double);
2  public static java.lang.String toHexString(double);
2  public static int compare(double, double);
2  public static boolean isNaN(double);
2  public boolean isNaN();
2  public static boolean isFinite(double);
2  public static boolean isInfinite(double);
2  public boolean isInfinite();
2  public static double sum(double, double);
2  public static double parseDouble(java.lang.String);

3  public static final double POSITIVE_INFINITY 
3  public static final double NEGATIVE_INFINITY 
3  public static final double NaN 
3  public static final double MAX_VALUE 
3  public static final double MIN_NORMAL 
3  public static final double MIN_VALUE 
3  public static final int MAX_EXPONENT 
3  public static final int MIN_EXPONENT 
3  public static final int SIZE 
3  public static final int BYTES 
3  public static final java.lang.Class TYPE 
3  private final double value 
3  private static final long serialVersionUID 
}

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/u012447842/article/details/84954223