Java-反射機制學習

反射機制是Java的一個重要性,它使得Java語言具備了動態特性。好比說,能夠在代碼中動態地獲取某個類的信息,生成它的實例、獲取其成員變量、調用它的方法。下面經過幾個示例來演示反射機制的做用與用法。css

示例1.獲取類的信息java

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

/*
 * @Date 20160223
 * 演示瞭如何經過反射機制獲取指定類的構造方法、超類、接口、域和方法
 */
public class ClassInfoCollector {
 
    public void run() throws Exception {
        Class c = Class.forName("java.lang.Long");
        Class [] cs = {java.lang.String.class};
        System.out.println("\n-------------------------------\n");
         
        Constructor cs1 = c.getConstructor(cs);
        System.out.println("一、經過參數獲取指定Class對象的構造方法:");
        System.out.println(cs1.toString());
 
        Constructor cs2 = c.getDeclaredConstructor(cs);
        System.out.println("二、經過參數獲取指定Class對象所表示的類或接口的構造方法:");
        System.out.println(cs2.toString());
 
        Constructor cs3 = c.getEnclosingConstructor();
        System.out.println("三、獲取本地或匿名類Constructor 對象,它表示基礎類的當即封閉構造方法。");
        if (cs3 != null) System.out.println(cs3.toString());
        else System.out.println("-- 沒有獲取到任何構造方法!");
 
        Constructor[] css = c.getConstructors();
        System.out.println("四、獲取指定Class對象的全部構造方法:");
        for (int i = 0; i < css.length; i++) {
            System.out.println(css[i].toString());
        }
 
        System.out.println("\n-------------------------------\n");
        
        Type [] tys1 = c.getGenericInterfaces();
        System.out.println("一、返回直接實現的接口:");
        for (int i = 0; i < tys1.length; i++) {
            System.out.println(tys1[i].toString());
        }
        
        Type type1 = c.getGenericSuperclass();
        System.out.println("二、返回直接超類:");
        System.out.println(type1.toString());
        
        Class [] cls1 = c.getClasses();
        System.out.println("三、返回超類和全部實現的接口:");
        for (int i = 0; i < cls1.length; i++) {
            System.out.println(cls1[i].toString());
        }
 
        Class [] cls2 = c.getInterfaces();
        System.out.println("四、實現的接口");
        for (int i = 0; i < cls2.length; i++) {
            System.out.println(cls2[i].toString());
        }
        
        System.out.println("\n-------------------------------\n");
        Field [] fds1 = c.getFields();
        System.out.println("一、類或接口的全部可訪問公共字段:");
        for (int i = 0; i < fds1.length; i++) {
            System.out.println(fds1[i].toString());
        }
        
        Field [] fds2 = c.getDeclaredFields();
        System.out.println("二、類或接口所聲明的全部字段:");
        for (int i = 0; i < fds2.length; i++) {
            System.out.println(fds2[i].toString());
        }
        
        
        Field fd1 = c.getField("MIN_VALUE");
        System.out.println("三、類或接口的指定已聲明指定公共成員字段:");
        System.out.println(fd1.toString());
 
        Field fd2 = c.getDeclaredField("serialVersionUID");
        System.out.println("四、類或接口的指定已聲明指定字段:");
        System.out.println(fd2.toString());
        
        System.out.println("\n-------------------------------\n");
        
        Method [] md1 = c.getMethods();
        System.out.println("一、返回類全部的公共成員方法:");
        for (int i = 0; i < md1.length; i++) {
            System.out.println(md1[i].toString());
        }
        
        Method [] md2 = c.getDeclaredMethods();
        System.out.println("二、返回類全部的成員方法:");
        for (int i = 0; i < md2.length; i++) {
            System.out.println(md2[i].toString());
        }
        
        Method m3 = c.getMethod("longValue", new Class[]{});
        System.out.println("三、返回指定公共成員方法:");
        System.out.println(m3.toString());
        }
    
    public static void main(String args[]) throws Exception {
        ClassInfoCollector cic = new ClassInfoCollector();
        cic.run();
    }
}

輸出以下:數組


-------------------------------ide

一、經過參數獲取指定Class對象的構造方法:
public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
二、經過參數獲取指定Class對象所表示的類或接口的構造方法:
public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
三、獲取本地或匿名類Constructor 對象,它表示基礎類的當即封閉構造方法。
-- 沒有獲取到任何構造方法!
四、獲取指定Class對象的全部構造方法:
public java.lang.Long(long)
public java.lang.Long(java.lang.String) throws java.lang.NumberFormatExceptionspa

-------------------------------code

一、返回直接實現的接口:
java.lang.Comparable<java.lang.Long>
二、返回直接超類:
class java.lang.Number
三、返回超類和全部實現的接口:
四、實現的接口
interface java.lang.Comparableorm

-------------------------------對象

一、類或接口的全部可訪問公共字段:
public static final long java.lang.Long.MIN_VALUE
public static final long java.lang.Long.MAX_VALUE
public static final java.lang.Class java.lang.Long.TYPE
public static final int java.lang.Long.SIZE
public static final int java.lang.Long.BYTES
二、類或接口所聲明的全部字段:
public static final long java.lang.Long.MIN_VALUE
public static final long java.lang.Long.MAX_VALUE
public static final java.lang.Class java.lang.Long.TYPE
private final long java.lang.Long.value
public static final int java.lang.Long.SIZE
public static final int java.lang.Long.BYTES
private static final long java.lang.Long.serialVersionUID
三、類或接口的指定已聲明指定公共成員字段:
public static final long java.lang.Long.MIN_VALUE
四、類或接口的指定已聲明指定字段:
private static final long java.lang.Long.serialVersionUIDblog

-------------------------------接口

一、返回類全部的公共成員方法:
public static int java.lang.Long.numberOfLeadingZeros(long)
public static int java.lang.Long.numberOfTrailingZeros(long)
public static int java.lang.Long.bitCount(long)
public boolean java.lang.Long.equals(java.lang.Object)
public java.lang.String java.lang.Long.toString()
public static java.lang.String java.lang.Long.toString(long,int)
public static java.lang.String java.lang.Long.toString(long)
public int java.lang.Long.hashCode()
public static int java.lang.Long.hashCode(long)
public static long java.lang.Long.min(long,long)
public static long java.lang.Long.max(long,long)
public static long java.lang.Long.reverseBytes(long)
public int java.lang.Long.compareTo(java.lang.Object)
public int java.lang.Long.compareTo(java.lang.Long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String,java.lang.Long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String,long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String)
public byte java.lang.Long.byteValue()
public short java.lang.Long.shortValue()
public int java.lang.Long.intValue()
public long java.lang.Long.longValue()
public float java.lang.Long.floatValue()
public double java.lang.Long.doubleValue()
public static java.lang.Long java.lang.Long.valueOf(long)
public static java.lang.Long java.lang.Long.valueOf(java.lang.String,int) throws java.lang.NumberFormatException
public static java.lang.Long java.lang.Long.valueOf(java.lang.String) throws java.lang.NumberFormatException
public static java.lang.String java.lang.Long.toHexString(long)
public static int java.lang.Long.compare(long,long)
public static java.lang.Long java.lang.Long.decode(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.reverse(long)
public static long java.lang.Long.sum(long,long)
public static int java.lang.Long.compareUnsigned(long,long)
public static long java.lang.Long.divideUnsigned(long,long)
public static long java.lang.Long.highestOneBit(long)
public static long java.lang.Long.lowestOneBit(long)
public static long java.lang.Long.parseLong(java.lang.String,int) throws java.lang.NumberFormatException
public static long java.lang.Long.parseLong(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.remainderUnsigned(long,long)
public static long java.lang.Long.rotateLeft(long,int)
public static long java.lang.Long.rotateRight(long,int)
public static int java.lang.Long.signum(long)
public static java.lang.String java.lang.Long.toBinaryString(long)
public static java.lang.String java.lang.Long.toOctalString(long)
public static java.lang.String java.lang.Long.toUnsignedString(long)
public static java.lang.String java.lang.Long.toUnsignedString(long,int)
public static long java.lang.Long.parseUnsignedLong(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.parseUnsignedLong(java.lang.String,int) throws java.lang.NumberFormatException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
二、返回類全部的成員方法:
public static int java.lang.Long.numberOfLeadingZeros(long)
public static int java.lang.Long.numberOfTrailingZeros(long)
public static int java.lang.Long.bitCount(long)
public boolean java.lang.Long.equals(java.lang.Object)
public java.lang.String java.lang.Long.toString()
public static java.lang.String java.lang.Long.toString(long,int)
public static java.lang.String java.lang.Long.toString(long)
public int java.lang.Long.hashCode()
public static int java.lang.Long.hashCode(long)
public static long java.lang.Long.min(long,long)
public static long java.lang.Long.max(long,long)
public static long java.lang.Long.reverseBytes(long)
public int java.lang.Long.compareTo(java.lang.Object)
public int java.lang.Long.compareTo(java.lang.Long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String,java.lang.Long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String,long)
public static java.lang.Long java.lang.Long.getLong(java.lang.String)
public byte java.lang.Long.byteValue()
public short java.lang.Long.shortValue()
public int java.lang.Long.intValue()
public long java.lang.Long.longValue()
public float java.lang.Long.floatValue()
public double java.lang.Long.doubleValue()
public static java.lang.Long java.lang.Long.valueOf(long)
public static java.lang.Long java.lang.Long.valueOf(java.lang.String,int) throws java.lang.NumberFormatException
public static java.lang.Long java.lang.Long.valueOf(java.lang.String) throws java.lang.NumberFormatException
public static java.lang.String java.lang.Long.toHexString(long)
public static int java.lang.Long.compare(long,long)
public static java.lang.Long java.lang.Long.decode(java.lang.String) throws java.lang.NumberFormatException
static void java.lang.Long.getChars(long,int,char[])
public static long java.lang.Long.reverse(long)
static int java.lang.Long.stringSize(long)
public static long java.lang.Long.sum(long,long)
public static int java.lang.Long.compareUnsigned(long,long)
public static long java.lang.Long.divideUnsigned(long,long)
public static long java.lang.Long.highestOneBit(long)
public static long java.lang.Long.lowestOneBit(long)
public static long java.lang.Long.parseLong(java.lang.String,int) throws java.lang.NumberFormatException
public static long java.lang.Long.parseLong(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.remainderUnsigned(long,long)
public static long java.lang.Long.rotateLeft(long,int)
public static long java.lang.Long.rotateRight(long,int)
public static int java.lang.Long.signum(long)
public static java.lang.String java.lang.Long.toBinaryString(long)
public static java.lang.String java.lang.Long.toOctalString(long)
public static java.lang.String java.lang.Long.toUnsignedString(long)
public static java.lang.String java.lang.Long.toUnsignedString(long,int)
static java.lang.String java.lang.Long.toUnsignedString0(long,int)
static int java.lang.Long.formatUnsignedLong(long,int,char[],int,int)
public static long java.lang.Long.parseUnsignedLong(java.lang.String) throws java.lang.NumberFormatException
public static long java.lang.Long.parseUnsignedLong(java.lang.String,int) throws java.lang.NumberFormatException
private static java.math.BigInteger java.lang.Long.toUnsignedBigInteger(long)
三、返回指定公共成員方法:
public long java.lang.Long.longValue()

=========================

能夠看到,可以獲取的信息很是全面。

 

示例2.動態調用類的方法

import java.lang.reflect.Method;
import java.lang.reflect.Type;
/*
 * @Date 20160223
 * 演示瞭如何經過反射機制調用指定類的方法,以add()和echo()爲例
 */
public class MethodInvoker {
     public int add(int param1, int param2) {
            return param1 + param2;
        }
     
        public String echo(String msg) {
            return "echo: " + msg;
        }
     
        public static void main(String[] args) throws Exception {
            Class<?> classType = MethodInvoker.class;
            Object invokeTester = classType.newInstance();
     
            //獲取InvokeTester類的add()方法
            Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
            //調用invokeTester對象上的add()方法
            Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)});
            System.out.println((Integer) result);
     
     
            //獲取InvokeTester類的echo()方法
            Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
            //調用invokeTester對象的echo()方法
            result = echoMethod.invoke(invokeTester, new Object[]{"Hello"});
            System.out.println((String) result);
        }
    }

輸出以下:

300
echo: Hello

===================================

在示例2中,首先使用classType.newInstance()生成了該類的對象,而後獲取了其add和echo方法,最後調用了這兩個方法。

 

示例3.訪問對象的成員變量

import java.lang.reflect.Field;


/*
 * @Date 20160223
 * 演示瞭如何經過java.lang.reflect.Field類的get和set方法動態調整對象的域
 */

public class FieldModifier {
    public double x;
    public double y;
    private double z;
 
    public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException {
        Class c = FieldModifier.class;
        Field xf = c.getField("x");
        Field yf = c.getField("y");
        Field zf = c.getDeclaredField("z");
 
        FieldModifier obj = new FieldModifier();
        
        //變動成員x值
        System.out.println("變動前x=" + xf.get(obj));
        xf.set(obj, 1.1);
        System.out.println("變動後x=" + xf.get(obj));
        
        //變動成員y值
        System.out.println("變動前y=" + yf.get(obj));
        yf.set(obj, 2.1);
        System.out.println("變動後y=" + yf.get(obj));       
        
        //變動成員z值
        System.out.println("變動前z=" + zf.get(obj));
        zf.set(obj, 3.1);
        System.out.println("變動後z=" + zf.get(obj));
    }
}

輸出以下:

變動前x=0.0
變動後x=1.1
變動前y=0.0
變動後y=2.1
變動前z=0.0
變動後z=3.1

==================

示例3經過Field的get和set方法訪問成員變量,包括私有成員。

 

示例4.動態建立和調整數組

import java.lang.reflect.Array;
/*
 * @Date 20160223
 * 演示瞭如何經過java.lang.reflect.Array動態建立和調整數組
 * 
 */
public class DynamicArrayTest2 {

    public static void main(String args[]) {
        int[] dims = new int[]{5, 10, 15};//指定即將創造的數組在每一維度上的長度
        //建立一個具備指定的組件類型和維度的新數組。
        Object array = Array.newInstance(Integer.TYPE, dims);
       
        Object arrayObj = Array.get(array, 3);//第array[][][3]個5*10的整型[][]數組
        Class<?> cls = arrayObj.getClass().getComponentType();
        System.out.println(cls);
 
        arrayObj = Array.get(arrayObj, 5);//第array[][5][3]個整型[]數組
        Array.setInt(arrayObj, 10, 37);//第array[10][5][3]個整型數,設置其值爲37
        int arrayCast[][][] = (int[][][]) array;
        System.out.println(arrayCast[3][5][10]);
    }
}

 

輸出以下:

class [I
37

=========================

利用java.lang.reflect.Array來實現數組的建立與操做。

相關文章
相關標籤/搜索