Bootstrap

java method getdeclaredmethod_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:根据传入的对象实例,通过配置的实参参数来调用方法

简答举个例子:

packagecom;public classPerson {private intage;privateString name;public Person( String name,intage) {this.age =age;this.name =name;

}publicPerson() {

}//公有 有参方法

public void public_show(String str,inti)

{

System.out.println("public show "+str+"..."+i);

}//公有 无参方法

public voidpublic_prin()

{

System.out.println("public prin");

}//私有 有参方法

private void private_show(String str,inti)

{

System.out.println("private show "+str+"..."+i);

}//私有 无参方法

private voidprivate_prin()

{

System.out.println("private prin");

}

}

public classMain {public static void main(String[] args) throwsException {//获取字节码文件中 方法 再取出其公有方法

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();

}

d6c8bced067c438be28fa3cf2dd0fe16.png

代码部分来源于:

https://blog.csdn.net/qq_35146878/article/details/78504268

;