集册 Java实例教程 类反射以获取类成员:字段,方法,构造函数

类反射以获取类成员:字段,方法,构造函数

欢马劈雪     最近更新时间:2020-01-02 10:19:05

499
类反射以获取类成员:字段,方法,构造函数
/** from nowjava**/

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Member;

import static java.lang.System.out;


enum ClassMember {

    CONSTRUCTOR, FIELD, METHOD, CLASS, ALL

}


public class ClassSpy {

    public static void main(String... args) {

        try {

            Class<?> c = Class.forName(args[0]);

            out.format("Class:%n  %s%n%n", c.getCanonicalName());


            Package p = c.getPackage();

            out.format("Package:%n  %s%n%n", (p != null ? p.getName()

                    : "-- No Package --"));
                    /* from 
                    N o w J a v a . c o m - 时  代  Java*/


            for (int i = 1; i < args.length; i++) {

                switch (ClassMember.valueOf(args[i])) {

                case CONSTRUCTOR:

                    printMembers(c.getConstructors(), "Constructor");

                    break;

                case FIELD:

                    printMembers(c.getFields(), "Fields");

                    break;

                case METHOD:

                    printMembers(c.getMethods(), "Methods");

                    break;

                case CLASS:

                    printClasses(c);

                    break;

                case ALL:

                    printMembers(c.getConstructors(), "Constuctors");

                    printMembers(c.getFields(), "Fields");

                    printMembers(c.getMethods(), "Methods");

                    printClasses(c);

                    break;

                default:

                    assert false;

                }

            }


            // production code should handle these exceptions more gracefully

        } catch (ClassNotFoundException x) {

            x.printStackTrace();

        }

    }


    private static void printMembers(Member[] mbrs, String s) {

        out.format("%s:%n", s);

        for (Member mbr : mbrs) {

            if (mbr instanceof Field)

                out.format("  %s%n", ((Field) mbr).toGenericString());

            else if (mbr instanceof Constructor)

                out.format("  %s%n", ((Constructor) mbr).toGenericString());

            else if (mbr instanceof Method)

                out.format("  %s%n", ((Method) mbr).toGenericString());

        }

        if (mbrs.length == 0)

            out.format("  -- No %s --%n", s);

        out.format("%n");

    }


    private static void printClasses(Class<?> c) {

        out.format("Classes:%n");

        Class<?>[] clss = c.getClasses();

        for (Class<?> cls : clss)

            out.format("  %s%n", cls.getCanonicalName());

        if (clss.length == 0)

            out.format("  -- No member interfaces, classes, or enums --%n");

        out.format("%n");

    }

}


展开阅读全文