关于反射中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
												

java 反射机制之 getDeclaredMethod()获取方法,然后invoke执行实例对应的方法的更多相关文章

  1. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

    方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...

  2. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  3. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

  4. java反射机制获取自定义注解值和方法

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...

  5. Java反射机制一 概念和简单的使用方法。

    一 概念 java反射机制属于 java动态性之一  ,指的是可以运行时加载,探知,使用编译期间完全未知的类,程序在运行状态中,可以动态的加载一个只有, 名称的类,对于任意一个已加载的类,都能够知道这 ...

  6. 浅谈Java反射机制 之 使用类的 属性、方法和构造函数

    前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...

  7. Java反射机制能够获取的信息,与应用

    一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...

  8. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  9. Java反射机制获取Class文件

    JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...

随机推荐

  1. 一步一步搭建oracle 11gR2 rac+dg之环境准备(二)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之环境准备 (二) 一步一步搭建oracle 11gR2 rac+dg之环境准备 ...

  2. Flask:初见

    Windows 10家庭中文版,Python 3.6.4 从Flask官网开始学起. 介绍 Flask是一个Python的Web开发微框架,基于Werkzeug.Jinja2模块(and good i ...

  3. 练习题 --- 10种Xpath定位

    写出10种不同的Xpath定位语法

  4. 【CF767C】Garland

    传送门啦 分析: 这个题我是看着翻译做的,感觉不是很难,很普通的一个树形dp 题目大意: 在一棵树上分离出三个子树,使这三个子树的点权和相等. 明确题目意思这个题就简单多了吧. 我们会发现每一棵子树的 ...

  5. 关于 poScreenCenter 与 poDesktopCenter

    主要是窗体水平方向与垂直方向的的 居中问题,由于水平方向 没有什么,所以不探讨.而垂直方向由于底部有个工具栏,工具栏自身有个高度,所以垂直方向的居中问题,需要探讨下. 结论: poScreenCent ...

  6. (四)SpringMvc文件上传

    第一节:SpringMvc单文件上传 第二节:SpringMvc多文件上传

  7. 让你的 JMeter 像 LoadRunner 那样实时查看每秒事务数(TPS)、事务响应时间(TRT)

    熟悉 LoadRunner 的朋友一定不会对其 TPS(每秒事务数).TRT(事务响应时间) 等视图感到陌生,因为这是压力测试最为关键的两个指标.JMeter 以其开源.轻巧.灵活.扩展性高等特性赢得 ...

  8. 20155309南皓芯 实验2 Windows口令破解

    在网络界,攻击事件发生的频率越来越高,其中相当多的都是由于网站密码泄露的缘故,或是人为因素导致,或是口令遭到破解,所以从某种角度而言,密码的安全问题不仅仅是技术上的问题,更主要的是人的安全意识问题. ...

  9. #define const typedef

    #define用法 1. 定义简单的常数:定义常量,便于修改 #define N 1000 2. 定义简单的函数:注意多使用括号 define可以像函数那样接受一些参数,如下: #define max ...

  10. 【AtCoder】AGC005F - Many Easy Problems

    题解 我们把一个点的贡献转化为一条边的贡献,因为边的数量是点的数量-1,最后再加上选点方案数\(\binom{n}{k}\)即可 一条边的贡献是\(\binom{n}{k} - \binom{a}{k ...