java反射的基本概念和简单应用

来源:互联网 发布:淘宝怎样做充值话费 编辑:程序博客网 时间:2024/06/07 06:52

能够分析类能力的程序称为反射。反射可以用来:
1.在运行时分析类的能力
2.在运行时查看对象,例如,编写一个toString方法供所有类使用
3.实现通用的操作代码。例如:通用dao
一般使用它的主要是工具制造者。

下面介绍反射机制最重要的内容—–检查类的结构
在java.lang.reflect包中有三个类Field、Constuctor、Method分别用于描述类的域、构造器和方法。其次,还可以利用Modifier类的静态方法分析getModifiers返回的整型数值。利用Modifier.toString方法来获取修饰符。
下面代码
代码描述:输入任意类的名称,打印出类的结构。

import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.Scanner;public class ReflectDemo {    public static void main(String[] args) {        try {            System.out.println("input className:");            Scanner sc = new Scanner(System.in);            String className = sc.next();            Class clazz = Class.forName(className);            Class superClass = clazz.getSuperclass();//获取该类的父类            String modifies = Modifier.toString(clazz.getModifiers());//获取修饰符            if (modifies.length() > 0)                System.out.print(modifies + " ");            System.out.print("class " + className);            if (superClass != null && superClass != Object.class)                System.out.print(" extends " + superClass.getName());            System.out.print("\n{\n");            printFields(clazz);            System.out.println();            printConstructors(clazz);            System.out.println();            printMethods(clazz);            System.out.print("}");        } catch (Exception e) {            e.printStackTrace();        }    }    // 打印该类的所有的方法    private static void printMethods(Class clazz) {        Method[] methods = clazz.getDeclaredMethods();//获取该类的所有方法        for (Method method : methods) {            Class<?> type = method.getReturnType();            String name = method.getName();            String modifies = Modifier.toString(method.getModifiers());            System.out.print("  ");            if (modifies.length() > 0)                System.out.print(modifies + " ");            System.out.print(type.getName() + " " + name + "(");            Class[] parameterTypes = method.getParameterTypes();            for (int i = 0; i < parameterTypes.length; i++) {                if (i > 0)                    System.out.print(",");                System.out.print(parameterTypes[i].getName());            }            System.out.println(");");        }    }    // 打印该类的所有构造方法    private static void printConstructors(Class clazz) {        Constructor[] constructors = clazz.getDeclaredConstructors();//获取该类的所有构造器        for (Constructor constructor : constructors) {            String name = constructor.getName();            String modifies = Modifier.toString(constructor.getModifiers());            System.out.print("  ");            if (modifies.length() > 0)                System.out.print(modifies + " ");            System.out.print(name + "(");            Class[] parameterTypes = constructor.getParameterTypes();            for (int i = 0; i < parameterTypes.length; i++) {                if (i > 0)                    System.out.print(",");                System.out.print(parameterTypes[i].getName());            }            System.out.println(");");        }    }    // 打印该类的所有的属性    private static void printFields(Class clazz) {        Field[] fields = clazz.getDeclaredFields();//获取该类的所有属性        for (Field field : fields) {            Class fieldType = field.getType();            String fieldName = field.getName();            String modifies = Modifier.toString(field.getModifiers());            System.out.print("  ");            if (modifies.length() > 0)                System.out.print(modifies + " ");            System.out.print(fieldType.getName() + " " + fieldName + ";\n");        }    }}

例如: 输入:java.lang.Double
输出结果:

public final class java.lang.Double extends java.lang.Number{    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;    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);}
原创粉丝点击