Constructor,Field,Meothd類的反射應用


package day5demo;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public classday5demo2 {

    /**


     * @param args


     */

    public static void main(String[] args) throws Exception{

        // TODO Auto-generated method stu

        Stringstr1="abc";

//三種獲得class對象的方法

        Class cls1=str1.getClass();

        Classcls2=String.class;

        Classcls3=Class.forName("java.lang.String");

        System.out.println(cls1==cls2);

        System.out.println(cls2==cls3);

        System.out.println(cls1==cls3);

        System.out.println(cls1.isPrimitive());

        System.out.println(int.class.isPrimitive());

        System.out.println(int.class==Integer.class);

        System.out.println(int.class==Integer.TYPE);

        System.out.println(int[].class.isPrimitive());

        System.out.println(int[].class.isArray());

//編譯的時候只知道它是一個Constructor,但是並不知道它是誰的Constructor,只有在運行時才知道它是StringConstructor

Constructor constructor1=String.class.getConstructor(StringBuffer.class);

//newInstance方法的返回值是一個Object,但是不知道是哪個對象,所以要轉換成String,

//要不然會報錯,newInstance中的參數類型來確定調用哪一個構造方法。

Stringstr2=(String)constructor1.newInstance(new StringBuffer("abc"));

        System.out.println(str2.charAt(2));

// Field類反射應用示例代碼:

    ReflectPointpt1=newReflectPoint(3, 5);

        Fieldfiedy=pt1.getClass().getField("y");

        //fiedy的值是多少?5,錯。fiedy代表的是類的變量,而不是對象的變量,要用它去獲取對象上變量的值。

        Fieldfiedx=pt1.getClass().getDeclaredField("x");//訪問申明的成員。

        fiedx.setAccessible(true);//暴力反射,訪問私有成員變量時需要添加該方法設//置訪問權限,也叫暴力反射。

        System.out.println(fiedy.get(pt1));

        System.out.println(fiedx.get(pt1));

//利用方式實現將一個類裏面的所有字符串成員變量中的”b”改成”a”

        changeStringValue(pt1);

        System.out.println(pt1);

//利用反射調用String類的方法。

        MethodMethodCharAt=String.class.getMethod("charAt", int.class);

        System.out.println(MethodCharAt.invoke(str1,1));

    }

    private static voidchangeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {

        // TODO Auto-generated method stub

        Field[]fields = obj.getClass().getFields();

        for(Field field:fields)

        {

            if(field.getType()==String.class)

            {

                Stringoldvalue=(String)field.get(obj);

                Stringnewvalue=oldvalue.replace("b", "a");

                field.set(obj,newvalue);

            }

        }

    }

}


 

ReflectPoint類:


package day5demo;


 


public classReflectPoint {


    private int x;


    public int y;


    public String str1="ball";


    public String str2="basketball";


    public String str3="itcast";


    public ReflectPoint(int x, int y) {


        super();


        this.x = x;


        this.y = y;


    }


    @Override


    public String toString() {


        return "ReflectPoint [x="+ x + ", y=" + y + ", str1="+ str1


                +", str2="+ str2+ ", str3="+ str3+ "]";


    }


}


 





發佈了38 篇原創文章 · 獲贊 25 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章