java——反射机制

java的反射机制也是java中的一个重点,反射机制能够使我们很方便的创建灵活的代码,这些代码可以在运行时装配,可以动态地获取某个对象的类信息以及调用该类的方法。

1. 反射机制的主要作用

通过反射机制访问java对象的属性,方法,构造方法等。通过反射机制,程序是可以访问和修改它本身状态或者行为的

其实反射机制就是类似于一个反编译的过程,可以通过.class文件反编译来获得.java文件中的一些内容

 

2. java API中和反射相关的包主要是java.lang.reflect。

常用的一些类

Class:代表一个类

Field:代表类的成员变量

Method:代表类的方法

Constructor:代表类的构造方法

常用的方法:

getName():获取类名

getFields():获取类public类型的成员变量

getDeclaredFields():获取类的所有属性

getMethods():获取类的public类型的方法

getDeclaredMethods():获取类的所有方法

getType():成员变量类型 int,long等

getReturnType():获取方法的类型

getConstructors():获得类的public类型的构造方法

getConstructors(Class[] parameterTypes):获取类的特定构造方法,parameterTypes是参数指定的构造方法

3. 在运行时判断一个对象所属的类

        try {       //第一种方式,这种方式一定要写全类的路径,例如java.lang.Integer,而且要处理异常
            Class<?> class1 = Class.forName("baseType.FileCopy");
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        
        //第二种方法,可以直接获取
        Class class2 = FileCopy.class;
        
     //第三种方法,先实例化类,然后根据对象来获取 FileCopy fc
= new FileCopy(); Class class3 = fc.getClass();

 

4. 在运行时构造任意一个类的对象

        Class class2 = FileCopy.class;
        try {
            Object obj = class2.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

在创建新的对象时,同样注意要抛出异常

 

5. 在运行时判断任意一个类所具有的成员变量

这里举例获取integer的所有成员变量

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try {
            Class class1 = Class.forName("java.lang.Integer");
            Field[] file = class1.getDeclaredFields();
            StringBuffer sb = new StringBuffer();
            sb.append(Modifier.toString(class1.getModifiers())+" class "+class1.getSimpleName()+"{\n");
            for(Field f:file){
                sb.append("\t");
                sb.append(Modifier.toString(f.getModifiers())+" ");  //获得属性的修饰符
                sb.append(f.getType().getSimpleName()+" ");   //属性类型名
                sb.append(f.getName()+";\n");
                
            }
            sb.append("}");
            System.out.println(sb);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

运行结果如下:

public final class Integer{
    public static final int MIN_VALUE;
    public static final int MAX_VALUE;
    public static final Class TYPE;
    static final char[] digits;
    static final char[] DigitTens;
    static final char[] DigitOnes;
    static final int[] sizeTable;
    private final int value;
    public static final int SIZE;
    public static final int BYTES;
    private static final long serialVersionUID;
}

6. 在运行是判断一个类的所有方法(当然也可以在运行时调用任意一个方法)

        //获取类的所有方法
        try {
            Class class1 = Class.forName("java.lang.Integer");
            Method[] method = class1.getDeclaredMethods();
            StringBuffer sb = new StringBuffer();
            sb.append(Modifier.toString(class1.getModifiers())+" class "+class1.getSimpleName()+"{\n");
            for(Method m:method){
                sb.append("\t");
                sb.append(Modifier.toString(m.getModifiers())+" ");  //获得属性的修饰符
                sb.append(m.getReturnType().getSimpleName()+" ");   //属性类型名
                sb.append(m.getName()+";\n");
            }
            sb.append("}");
            System.out.println(sb);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

运行结果:

public final class Integer{
    public static int numberOfLeadingZeros;
    public static int numberOfTrailingZeros;
    public static int bitCount;
    public boolean equals;
    public static String toString;
    public String toString;
    public static String toString;
    public static int hashCode;
    public int hashCode;
    public static int min;
    public static int max;
    public static int reverseBytes;
    public int compareTo;
    public volatile int compareTo;
    public byte byteValue;
    public short shortValue;
    public int intValue;
    public long longValue;
    public float floatValue;
    public double doubleValue;
    public static Integer valueOf;
    public static Integer valueOf;
    public static Integer valueOf;
    public static String toHexString;
    public static int compare;
    public static Integer decode;
    static void getChars;
    public static int reverse;
    static int stringSize;
    public static int sum;
    public static int parseInt;
    public static int parseInt;
    public static long toUnsignedLong;
    public static int compareUnsigned;
    public static int divideUnsigned;
    static int formatUnsignedInt;
    public static Integer getInteger;
    public static Integer getInteger;
    public static Integer getInteger;
    public static int highestOneBit;
    public static int lowestOneBit;
    public static int parseUnsignedInt;
    public static int parseUnsignedInt;
    public static int remainderUnsigned;
    public static int rotateLeft;
    public static int rotateRight;
    public static int signum;
    public static String toBinaryString;
    public static String toOctalString;
    public static String toUnsignedString;
    public static String toUnsignedString;
    private static String toUnsignedString0;
}

 

posted @ 2017-09-03 20:14  东木刀纹  阅读(124)  评论(0编辑  收藏  举报