關於反射中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