java 反射機制之 getDeclaredMethod()獲取方法,然后invoke執行實例對應的方法


關於反射中getDeclaredMethod().invoke()的學習,來源於項目中的一行代碼:

 

SubjectService.class.getDeclaredMethod(autoMatchConfig.getMethodName(), Integer.class).invoke(subjectService, GlobalConfig.OPEN_TO_IPLAN);
                  

獲取反射的方法有:

第一種:

Class c = SubjectService.class
第二種:
Class c = Class.forName(SubjectService)

獲取到 Class 之后,便可以獲取有參方法
c.getDeclaredMethod(String name, Class<?>... parameterTypes)
獲取本類中的所有方法 (只拿本類中的)
c.getDeclaredMethods();

繼續解析代碼中的
SubjectService.class.getDeclaredMethod(autoMatchConfig.getMethodName(), Integer.class)

其中,傳入的第一個參數是方法名,第二個參數名是方法參數,傳入這兩個參數之后,便可以根據方法名和方法參數通過反射獲取帶有參數的方法

然后
MethodName.invoke(subjectService, GlobalConfig.OPEN_TO_IPLAN)
其中,invoke方法中傳入的是上一步獲取到的方法的實例對象和方法傳入的實參

由此,通過反射獲取方法名和參數名,然后invoke方法注入方法對象和實參,

      getDeclaredMethod:返回Method方法對象;

      invoke:根據傳入的對象實例,通過配置的實參參數來調用方法



簡答舉個例子:

package com;
public class Person {
 
    private int age;
    private String name;
 
    public Person( String name,int age) {
        this.age = age;
        this.name = name;
    }
 
    public Person() {
    }
 
 
    //公有 有參方法
    public void public_show(String str,int i)
    {
        System.out.println("public show "+str+"..."+i);
    }

    //公有 無參方法
    public void public_prin()
    {
        System.out.println("public prin");
    }
 
 
    //私有 有參方法
    private void private_show(String str,int i)
    {
        System.out.println("private show "+str+"..."+i);
    }

    //私有 無參方法
    private void private_prin()
    {
        System.out.println("private prin");
    }
 
}
public class Main {
    public static void main(String[] args)  throws Exception {
 
        //獲取字節碼文件中 方法 再取出其公有方法
 
        String classname = "com.Person";
        //尋找名稱的類文件,加載進內存 產生class對象
        Class cl = Class.forName(classname);

        //獲取一個Person對象
        System.out.println("獲取一個Person對象:");
        Object obj=cl.newInstance();
        System.out.println();
 
 
        //1.獲取 公有 無參方法 public void demo2.Person.public_prin()
        Method Person_public_prin=cl.getMethod("public_prin",null);
        System.out.println("獲取執行 public void demo2.Person.public_prin() :");
        Person_public_prin.invoke(obj,null);
 
        System.out.println();
 
        //2.獲取 公有 有參方法 public void demo2.Person.public_show(java.lang.String,int)
        Method Person_public_show=cl.getMethod("public_show",String.class,int.class);
        System.out.println("獲取執行 public void demo2.Person.public_show(java.lang.String,int) :");
        Person_public_show.invoke(obj,"神奇的我",12);
 
        System.out.println();
 
        //3.獲取 私有 無參方法 private void demo2.Person.private_prin()
        Method Person_private_prin=cl.getDeclaredMethod("private_prin",null);
        Person_private_prin.setAccessible(true);
        System.out.println("獲取執行 private void demo2.Person.private_prin() :");
        Person_private_prin.invoke(obj,null);
 
        System.out.println();
 
        //4.獲取 私有 有參方法 private void demo2.Person.private_show(java.lang.String,int)
        Method Person_private_show=cl.getDeclaredMethod("private_show",String.class,int.class);
        Person_private_show.setAccessible(true);
        System.out.println("獲取執行 private void demo2.Person.private_show(java.lang.String,int) :");
        Person_private_show.invoke(obj,"神奇的私有",23);
 
        System.out.println();
    }

 

 
         
         
        

 

 
        
代碼部分來源於:
https://blog.csdn.net/qq_35146878/article/details/78504268


 
       


免責聲明!

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



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