Java之反射機制四:調用類的方法


一.調用類的公有方法

String str = "aa";
Class<? extends String> clazz = str.getClass();
Method concat = clazz.getMethod("concat", String.class);
Object bb = concat.invoke(str,"bb");
System.out.println(bb);

運行結果:

 

 二.調用類的私有方法

1.測試類

package reflex;

public class Test {
    private String a;

    private Test(){

    }

    public Test(String a) {
        this.a = a;
    }

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    private String concatStr(String b){
        return this.a.concat(b);
    }
}

2.調用該類的concatStr方法

@Test
    public void testInvoke() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        reflex.Test testStr = new reflex.Test("aa");
        Class<? extends reflex.Test> clazz = testStr.getClass();
        //獲取到該私有方法的Method對象
        Method method = clazz.getDeclaredMethod("concatStr", String.class);
        //忽略訪問修飾符的檢查
        method.setAccessible(true);
        Object obj = method.invoke(testStr, "bb");
        System.out.println(obj);
    }

調用結果:

 

 三.調用類的公有構造方法

@Test
    public void testConstructor() throws Exception {
        Class<reflex.Test> clazz = reflex.Test.class;
        //獲取該類的Constructor對象
        Constructor<reflex.Test> constructor = clazz.getConstructor(String.class);
        //Constructor.newInstance方法可以創建該類的實例
        reflex.Test hello = constructor.newInstance("hello");
        System.out.println(hello.getA());
    }

運行結果:

四.調用類的私有構造方法

    @Test
    public void testConstructor2() throws Exception {
        Class<reflex.Test> clazz = reflex.Test.class;
        Constructor<reflex.Test> constructor = clazz.getDeclaredConstructor();
        //忽略訪問修飾符的檢查
        constructor.setAccessible(true);
        reflex.Test test = constructor.newInstance();
        System.out.println(test);
    }

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM