Java 反射学习

来源:互联网 发布:mac pro是做什么用的 编辑:程序博客网 时间:2024/05/17 08:21

最近在看《java 核心技术》基础篇中,看到了反射一节。记录下,待后续参考复习;

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

Field类有一个getType方法,用来返回描述域所属类型的Class对象。 Method和Constructor类有能够报告参数类型的方法, Method类还有一个可以报告返回类型的方法。这三个类还有一个叫做getModifiers的方法,它将返回一个整型数值,用不同的位开关描述public和static这样的修饰符使用状况。

另外,还可以利用java.lang.reflect包中的Modifier类的静态方法分析getModifiers返回的整型数值。例如,可以使用Modifier类中的isPublic、 isPrivate或isFinal判断方法或构造器是否是public、 private或final。我们需要做的全部工作就是调用Modifier类的相应方法,并对返回的整型数值进行分析,另外,还可以利用Modifier.toString方法将修饰法打印出来。

Class类中的getFields、 getMethods和getConstructors方法将分别返回类提供的public域、方
法和构造器数组,其中包括超类的公有成员。 Class类的getDeclareFields、 getDeclareMethods和
getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受
保护成员,但不包括超类的成员。

例子:
输入:类名称
输出:类的构造器、方法、属性

/** * @Author: YLBG-YCY-1325 * @Description: 反射 * @Date: 2017/3/31 */public class ReflectionTest {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        System.out.println("输入类的全称(e.g. java.util.Date):");        String className = scanner.next();        try {            Class cls = Class.forName(className);            Class superClass = cls.getSuperclass();            String modifier = Modifier.toString(cls.getModifiers());            // 获取类前面的修饰符            if (modifier.length() > 0) {                System.out.printf(modifier + " ");            }            System.out.printf("class" + className);            // 超类继承            if (null != superClass && superClass != Object.class) {                System.out.printf(" extends " + superClass.getName());            }            System.out.printf("\n{\n");            printFileds(cls);            System.out.println();            printContructors(cls);            System.out.println();            printMethods(cls);            System.out.println("}");        } catch (Exception e) {            e.printStackTrace();        }        System.exit(0);    }    /**     * 打印类的所有构造器     * @param cls 反射类     */    public static void printContructors(Class cls) {        Constructor[] constructors = cls.getConstructors();        for (Constructor constructor : constructors) {            String modifier = Modifier.toString(constructor.getModifiers());            if (modifier.length()>0){                System.out.printf(modifier+" ");            }            System.out.printf(constructor.getName()+"(");            Class[] paramsType = constructor.getParameterTypes();            for (int j=0;j<paramsType.length;j++){                if (j>0){                    System.out.printf(",");                }                System.out.printf(paramsType[j].getName());            }            System.out.printf(");\n");        }    }    /**     * 打印所有方法     * @param cls 反射类     */    public static void printMethods(Class cls){        Method[] methods = cls.getMethods();        for (Method method:methods){            String modifier = Modifier.toString(method.getModifiers());            if (modifier.length()>0){                System.out.printf(modifier+" ");            }            //获取返回类型            Class returnType = method.getReturnType();            System.out.printf(returnType.getName()+" ");            System.out.printf(method.getName()+"(");            //获取参数类型            Class[] paramType = method.getParameterTypes();            for (int i=0;i<paramType.length;i++){                if (i>0){                    System.out.printf(",");                }                System.out.printf(paramType[i].getName());            }            System.out.printf(");\n");        }    }    /**     * 打印类的所有属性     * @param cls 反射类     */    private static void  printFileds(Class cls){        Field[] fields = cls.getDeclaredFields();        for (Field field:fields){            String modifier = Modifier.toString(field.getModifiers());            Class fieldType = field.getType();            if (modifier.length()>0){                System.out.printf(modifier + " ");            }            System.out.printf(fieldType+" ");            System.out.printf(field.getName()+";\n");        }    }}

上面,程序运行结果:

输入类的全称(e.g. java.util.Date):java.lang.Integerpublic final classjava.lang.Integer extends java.lang.Number{public static final int MIN_VALUE;public static final int MAX_VALUE;public static final class java.lang.Class TYPE;static final class [C digits;static final class [C DigitTens;static final class [C DigitOnes;static final class [I sizeTable;private final int value;public static final int SIZE;public static final int BYTES;private static final long serialVersionUID;public java.lang.Integer(int);public java.lang.Integer(java.lang.String);public static int numberOfLeadingZeros(int);public static int numberOfTrailingZeros(int);public static int bitCount(int);public boolean equals(java.lang.Object);public static java.lang.String toString(int,int);public java.lang.String toString();public static java.lang.String toString(int);public static int hashCode(int);public int hashCode();public static int min(int,int);public static int max(int,int);public static int reverseBytes(int);public int compareTo(java.lang.Integer);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.Integer valueOf(java.lang.String,int);public static java.lang.Integer valueOf(int);public static java.lang.Integer valueOf(java.lang.String);public static java.lang.String toHexString(int);public static int compare(int,int);public static java.lang.Integer decode(java.lang.String);public static int reverse(int);public static int sum(int,int);public static int parseInt(java.lang.String);public static int parseInt(java.lang.String,int);public static long toUnsignedLong(int);public static int compareUnsigned(int,int);public static int divideUnsigned(int,int);public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);public static java.lang.Integer getInteger(java.lang.String,int);public static java.lang.Integer getInteger(java.lang.String);public static int highestOneBit(int);public static int lowestOneBit(int);public static int parseUnsignedInt(java.lang.String);public static int parseUnsignedInt(java.lang.String,int);public static int remainderUnsigned(int,int);public static int rotateLeft(int,int);public static int rotateRight(int,int);public static int signum(int);public static java.lang.String toBinaryString(int);public static java.lang.String toOctalString(int);public static java.lang.String toUnsignedString(int);public static java.lang.String toUnsignedString(int,int);public final void wait();public final void wait(long,int);public final native void wait(long);public final native java.lang.Class getClass();public final native void notify();public final native void notifyAll();}
0 0
原创粉丝点击