java.lang.reflection打印一个类的全部信息

package com.ljy.chapter5;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

/**
 * This program uses reflection to print all features of a class.
 * @author LIAO JIANYA
 *
 */

public class ReflectionTest
{
    public static void main(String[] args)
    {
        //read class name from command time args or user input
        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();
        }
        try
        {
            //print class name and superclass name(if != Object)
            Class cl = Class.forName(name);
            Class supercl = cl.getSuperclass();
            String modifiers = Modifier.toString(cl.getModifiers());
            if(modifiers.length() > 0)
                System.out.print(modifiers + " ");
            System.out.print("class " + name);
            if(supercl != null && supercl != Object.class)
                System.out.print(" extends " + supercl.getName());

            System.out.print("\n{\n");
            printConstructors(cl);
            System.out.println();
            System.out.println("----------------------------------------");
            printMethods(cl);
            System.out.println();
            System.out.println("----------------------------------------");
            printFields(cl);
            System.out.println("}");
        }

        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }

        System.exit(0);
    }

    /**
     * Prints all constructor of a class
     * @param cl a class
     */
    public static void printConstructors(Class cl)
    {
        Constructor[] constructors = cl.getDeclaredConstructors();
        for(Constructor c : constructors)
        {
            String name = c.getName();
            System.out.print("    ");
            String modifiers = Modifier.toString(c.getModifiers());
            if(modifiers.length() > 0)
                System.out.print(modifiers + " ");
            System.out.print(name + "(");

            //print parameter types
            Class[] paramTypes = c.getParameterTypes();
            for(int j = 0; j < paramTypes.length; j++)
            {
                if(j > 0)
                    System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }

            System.out.println(");");

        }

    }
    /**
     * Prints all methods of a class
     * @param cl a class
     */

    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("   ");
            //print modifiers, return type and method name
            String modifiers = Modifier.toString(m.getModifiers());
            if(modifiers.length() > 0)
                System.out.print(modifiers + " ");
            System.out.print(retType.getName() + " " + name + "(");

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

        }
    }

    /**
     * Prints all fields of a class
     * @param cl a class
     */

    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("   ");
            String modifiers = Modifier.toString(f.getModifiers());
            if(modifiers.length() > 0)
                System.out.print(modifiers + " ");
            System.out.println(type.getName() + " " + name + ";");
        }
    }
}

这个程序将提醒用户输入类名,然后输出类中所有的方法和构造器的签名,以及全部域名。

输出结果:

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 native long doubleToRawLongBits(double
);
   public static long doubleToLongBits(double
);
   public static native double longBitsToDouble(long
);
   public int compareTo(java.lang.Double
);
   public volatile int compareTo(java.lang.Object
);
   public byte byteValue();
   public short shortValue();
   public int intValue();
   public long longValue();
   public float floatValue();
   public double doubleValue();
   public static java.lang.Double valueOf(double
);
   public static java.lang.Double valueOf(java.lang.String
);
   public static java.lang.String toHexString(double
);
   public static int compare(double
, double
);
   public static boolean isNaN(double
);
   public boolean isNaN();
   public static boolean isInfinite(double
);
   public boolean isInfinite();
   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 java.lang.Class TYPE;
   private final double value;
   private static final long serialVersionUID;
}

在java.lang.reflect包中有三个类Field、Method和Constructor分别是用于描述类的域、方法和构造器。

这三个类都有一个叫做getName的方法——用来返回项目的名称;getModifiers的方法——返回一个整型数值,用不同的位开关描述public和static这样的修饰符使用情况。

Field类有一个getType方法——用来返回描述域所属类型的Class对象。

Class类中的getFields、getMethods和getConstructors方法将分别返回类提供的public域、方法和构造数组,其中包括超类的公有成员。

Class类的getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将返回类中声明的全部域、方法和构造器,其中包括私有和受保护成员,但不包括超类的成员。

时间: 2024-10-06 04:44:53

java.lang.reflection打印一个类的全部信息的相关文章

Java.lang软件包中的类

Java.lang软件包是java语言的核心部分,它提供了java中的基础类.java.lang.Object,这是java.lang的根类,也是所有java类的超类.在构造java类的实例时,都先调用Object中的默认构造方法. 类java.lang.Class<T>也是一个非常重要的类.Class 类的实例用来表示正在运行的 Java 应用程序中的类和接口.Class对象在类加载时由JVM调用类加载器中的 defineClass 方法自动构造.java.lang.ClassLoader负

Java项目中每一个类都可以有一个main方法

Java项目中每一个类都可以有一个main方法,但只有一个main方法会被执行,其他main方法可以对类进行单元测试. public class StaticTest { public static void main(String[] args) { Employee[] staff=new Employee[3]; staff[0]=new Employee("Tom",40000); staff[1]=new Employee("Dick",60000); s

Java中如何查看一个类依赖的包

Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包? ? 测试语句: ? public static void main(String[] args) { ????????ProtectionDomain pd = JSONArray.class.getProtectionDomain(); ????????CodeSource cs = pd.getCodeSource(); ????????System.out.printl

利用反射api查找一个类的详细信息

说到这个实例,首先介绍下本人,我是一个php程序员,从事drupal开发2年多,可以说从实习开始就接触这个,至今没有换过,drupal给我的感觉是俩字"强大",今天写一个views的字段,然后需要继承views的views_handler_field类,还要自己实现里面的一些方法,走一些自己的配置设置,查看这个类的时候,发现实在是太多信息了,并且做了好些继承,于是我就想要是能实现一个功能,传入一个类名,然后就能返回类的所有信息(包括,属性,方法,继承,接口,并且这些类所放置的文件位置,

java能不能自己写一个类叫java.lang.System/String正确答案

原文: http://www.wfuyu.com/php/22254.html 未做测试 ! 最近学习了下java类加载相干的知识.然后看到网上有1道面试题是 能不能自己写个类叫java.lang.System? 网上提供的答案:通常不可以,但可以采取另类方法到达这个需求.所谓的另类方法指自己写个类加载器来加载java.lang.System到达目的. 首先表明下我的观点.上述答案完全是误导读者,是不正确的答案.我就疑惑了网上怎样把这类完全不正确的搜索结果排在前面,而且几近搜到的都是这类不正确的

java.lang包【Object类】

基本描述: (1)Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: (2)Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.可以使用类型为Object的变量指向任意类型的对象 Object的主要方法介绍: package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*

java学习笔记—实现一个类MyInputStream(28)

1 实现一个类MyInputStream读取文件,且不能抛出异常 public class TestDemo { public static void main(String[] args) throws Exception { InputStream in = new MyInputStream("d:/a/a.txt"); byte[] b = new byte[1024]; int len = 0; while((len=in.read(b))!=-1){ String s =

源码分析七(java.lang包之IllegalArgumentException类)

一:IllegalArgumentException非法参数类,这个类继承父类RuntimeException 1 public 2 class IllegalArgumentException extends RuntimeException 重载的几个构造方法都是直接调用父类的构造方法: //无参数构造器,默认构造器 public IllegalArgumentException() { super(); } //参数为字符串String的构造器 public IllegalArgument

Java通过反射获取一个类里的静态常量

public class FieldReflactTest{    public static final String a="test";    protected int b;    private int c;    String d;    public static void main(String[] args){       Field[] fields=FieldReflactTest.class.getDeclaredFields();       for(Field