使用Java反射你可以在运行期检查一个方法的信息以及在运行期调用这个方法,

通过使用java.lang.reflect.Method类就可以实现上述功能。

以下实例涉及的MyObject.java公用代码:

package com.lanhuigu.reflect.common;public class MyObject {/** 公开成员变量 */public String fieldName = "Test-Field-Name";/** 私有属性 */private String userName;private String password;/** 构造器 */public MyObject() {}public MyObject(String userName) {this.userName = userName;}public MyObject(String userName, String password) {this.userName = userName;this.password = password;}/** methods */public String doSomething(String something) {return "Hello World-" + something;}/** getter and setter methods */public String getFieldName() {return fieldName;}public void setFieldName(String fieldName) {this.fieldName = fieldName;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

获取Method对象

可以通过Class对象获取Method对象,如下例:

Class myClass = ...//获取Class对象

Method[] methods = myClass.getMethods();

返回的Method对象数组包含了指定类中声明为公有的(public)的所有变量集合。

eg:

package com.lanhuigu.reflect.methods;import com.lanhuigu.reflect.common.MyObject;import java.lang.reflect.Method;public class Test2 {public static void main(String[] args) {/** 获取Class对象 */Class myClass = MyObject.class;/** 获取公开(public)方法集合 */Method[] methods = myClass.getMethods();/** 循环打印方法名 */for (Method method : methods) {System.out.println("方法名:" + method.getName());}}
}

如果你知道你要调用方法的具体参数类型,你就可以直接通过参数类型来获取指定的方法,

下面这个例子中返回方法对象名称是“doSomething”,他的方法参数是String类型,如下例:

Class  myClass = ...//获取Class对象

Method method = myClass.getMethod("doSomething", new Class[]{String.class});

如果根据给定的方法名称以及参数类型无法匹配到相应的方法,则会抛出NoSuchMethodException。

eg:

package com.lanhuigu.reflect.methods;import com.lanhuigu.reflect.common.MyObject;import java.lang.reflect.Method;public class Test3 {public static void main(String[] args) throws NoSuchMethodException {/** 获取Class对象 */Class myClass = MyObject.class;/** 指定方法参数获取方法 */Method method = myClass.getMethod("doSomething", new Class[]{String.class});/** 打印方法名 */System.out.println("方法名:" + method.getName());}
}

如果你想要获取的方法没有参数,那么在调用getMethod()方法时第二个参数传入null即可,如下例:

Class  myClass = ...//获取Class对象

Method method = myClass.getMethod("doSomething", null);

方法参数以及返回类型

你可以获取指定方法的方法参数是哪些,如下例:

Class  myClass = ...//获取Class对象

Method method = ... //获取Method对象

Class[] parameterTypes = method.getParameterTypes();

eg:

package com.lanhuigu.reflect.methods;import com.lanhuigu.reflect.common.MyObject;import java.lang.reflect.Method;public class Test4 {public static void main(String[] args) throws NoSuchMethodException {/** 获取Class对象 */Class myClass = MyObject.class;/** 获取Method */Method method = myClass.getMethod("doSomething", new Class[]{String.class});/** 获取参数类型数组 */Class[] parameterTypes = method.getParameterTypes();/** 循环打印参数类型 */for (Class type : parameterTypes) {System.out.println("参数类型:" + type.getName());}}
}

你可以获取指定方法的返回类型,如下例:

Class  myClass = ...//获取Class对象

Method method = ... //获取Method对象

Class returnType = method.getReturnType();

eg:

package com.lanhuigu.reflect.methods;import com.lanhuigu.reflect.common.MyObject;import java.lang.reflect.Method;public class Test5 {public static void main(String[] args) throws NoSuchMethodException {/** 获取Class对象 */Class myClass = MyObject.class;/** 获取Method */Method method = myClass.getMethod("doSomething", new Class[]{String.class});/** 获取参数返回值类型 */Class returnType = method.getReturnType();System.out.println("方法返回值类型:" + returnType.getName());}
}

通过Method对象调用方法

你可以通过如下方式来调用一个方法,如下例:

//获取一个方法名为doSomesthing,参数类型为String的方法

Method method = MyObject.class.getMethod("doSomething", String.class);

Object returnValue = method.invoke(null, "parameter-value1");

传入的null参数是你要调用方法的对象,如果是一个静态方法调用的话则可以用null代替指定对象作为invoke()的参数,

在上面这个例子中,如果doSomething不是静态方法的话,你就要传入有效的MyObject实例而不是null。

Method.invoke(Object target, Object … parameters)方法的第二个参数是一个可变参数列表,

但是你必须要传入与你要调用方法的形参一一对应的实参。就像上个例子那样,方法需要String类型的参数,

那我们必须要传入一个字符串。

eg:

package com.lanhuigu.reflect.methods;import com.lanhuigu.reflect.common.MyObject;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test6 {public static void main(String[] args) throws NoSuchMethodException,InvocationTargetException, IllegalAccessException {/** 获取Class对象 */Class myClass = MyObject.class;/** 获取Method对象 */Method method = myClass.getMethod("doSomething", new Class[]{String.class});/** 方法调用 */MyObject myObject = new MyObject();Object returnValue = method.invoke(myObject, "parameter-value1");System.out.println("调用方法返回值:" + returnValue.toString());}
}

【Reflect】方法(Method)相关推荐

  1. 通过反射获取及调用方法(Method)

    1.获取方法 使用反射获取某一个类中的方法,步骤: ①找到获取方法所在类的字节码对象 ②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包 ...

  2. 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被

    2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...

  3. go语言中的方法method

    package main;import "fmt"//重新定义一个类型 //为该INT类型扩展方法 type INT int;type A struct {name string; ...

  4. 方法Method(Java)

    方法Method(Java) 示例一: public class Demo01 {//main 方法public static void main(String[] args) {//public s ...

  5. 面向对象编程(基础)5:类的成员之二:方法(method)

    目录 5.1 方法的引入 5.2 方法(method.函数)的理解 举例1: 举例2: 5.3 如何声明方法 1.声明方法的语法格式 (1)一个完整的方法 = 方法头 + 方法体. (2)方法头可能包 ...

  6. Java代码模块化-方法method

    Java代码模块化-方法method 1.method的概念 Java方法的目的:模块化.复用性.应用简单 2.结构 #mermaid-svg-WdGU5hKdhbgESetC .label{font ...

  7. Form表单提交方法method

    method="get",表单在提交时,填写在表单中的数据会和action="url"中的url编码在一起. method="post",表 ...

  8. Pycharm提示方法Method xxx may be 'static'

    使用Pycharm进行Python开发时,在类中定义方法时,若该方法不涉及对属性的操作,那么Pycharm会提示Method xxx may be 'static',因为Pycharm会认为该方法是一 ...

  9. 小白学Java代码:方法Method(下)

    package demo1; //注意:当一个Java源文件在指定的包中存放,则该源文件中第一行必须是包的声明,否则源文件必须在src目录下存放public class Method01 { } 编写 ...

最新文章

  1. CCIE-MPLS基础篇-实验手册
  2. c++类的应用和权限
  3. Ubuntu17.10 下配置caffe 仅CPU i386可以直接apt install caffe-cpu,但是怎么运行mnist代码我懵逼了...
  4. tensorflow.reshap(tensor,shape,name)的使用说明
  5. 字符串substring方法在jkd6,7,8中的差异
  6. (27)StyleLint—CSS代码格式校验
  7. mac系统和鸿蒙,鸿蒙发力,或将超越苹果系统
  8. three.js和php,详解three.js本地运行的方法
  9. js 開始时间,当前时间,结束时间的比較
  10. 《SpringBoot实战》笔记2
  11. 全国计算机等级考试网络版客户端,Sctest计算机等级考试系统网络版
  12. 如何利用软文营销将好品牌故事?
  13. 服务端性能测试入门指南
  14. 如何通过两步验证来保护您的Apple ID
  15. java 按字节读入_Java按字节读取文件
  16. 陈表达VBA学习笔记-新建工作表鼠标右键菜单按钮
  17. 日用品电商销售数据分析
  18. stm32+手势识别模块+步进电机,模拟一种无接触式手势识别电梯
  19. 分享25个超酷的凸活版印制(Letterprint)名片设计
  20. 解决集成 editor.md编辑器时,报 editormd is not defined的解决办法

热门文章

  1. WAF绕过神器 (过安全狗、智创SQL注入)
  2. pycharm设置SDK
  3. FFT Fast-Fourier-Transform(白话粗口18X) .
  4. 优信二手车:赛道虽好,生意难做
  5. 优信终于走出了低谷?
  6. 4.C++设计模式-结构型模型
  7. CorelDRAW2022电脑版矢量插图图形设计工具
  8. c/c++实现图像旋转任意角度
  9. 2018我从北京回到西安
  10. LCD驱动程序——代码编写(二)