问题: Java中获得了方法名称的字符串,怎么样调用该方法

如果我有以下两个变量

Object obj;
String methodName = "getName";

在不知道obj的类的情况下,我怎么样才能调用该类的名叫methodName的方法呢?

这个方法被调用时不带参数,并且返回的是一个字符串,这是一个Javabean的getter方法

回答一

java.lang.reflect.Method method;
try {method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }catch (NoSuchMethodException e) { ... }

这里的参数由你需要的具体的方法(如果有几个重载方法的话,如果没有参数就只需要给出方法名)决定

然后你就可以这样调用方法了

try {method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) { ... }catch (IllegalAccessException e) { ... }catch (InvocationTargetException e) { ... }

再次声明,如果你这个方法没有参数,就忽略arg1,arg2.

回答二

通过反射实现方法的调用:

Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);

“class name” 是类名

objectToInvokeOn是调用其方法的对象类型

method name 是你想要调用的方法名

parameterTypes是一个声明了方法接收参数的Class[]

params 是声明了传给参数的Object[]

回答三

这个方法可以这样被调用。可能会有更多的选择(查一下反射的APi吧),但是这个是最简单的

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import org.junit.Assert;
import org.junit.Test;public class ReflectionTest {private String methodName = "length";private String valueObject = "Some object";@Testpublic void testGetMethod() throws SecurityException, NoSuchMethodException, IllegalArgumentException,IllegalAccessException, InvocationTargetException {Method m = valueObject.getClass().getMethod(methodName, new Class[] {});Object ret = m.invoke(valueObject, new Object[] {});Assert.assertEquals(11, ret);}}

回答四

首先,请避免这种代码的的顺序。它真的是很差的并且也不安全。(请看第二版的Secure Coding Guidelines for the Java Programming Language的第六节)

文章翻译自Stack Overflow:https://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name-as-a-string

Java中获得了方法名称的字符串,怎么样调用该方法相关推荐

  1. java反转函数_在JAVA中,下列哪个函数可用于字符串的反转?

    在JAVA中,下列哪个函数可用于字符串的反转? 更多相关问题 很多危机是无法准确预测的,必须为危机做好准备,包括().通信计划以及重要关系的建立等. (A) 危 幼儿园科技小制作可分为模型类.动力类. ...

  2. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  3. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  4. Java中url传递中文参数取值乱码的解决方法

    Java中url传递中文参数取值乱码的解决方法 参考文章: (1)Java中url传递中文参数取值乱码的解决方法 (2)https://www.cnblogs.com/liwenjuan/p/3211 ...

  5. JAVA中的多线程(八):线程的优先级和yield方法

    JAVA中的多线程(八):线程的优先级和yield方法 优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runna ...

  6. java中给对象的List集合去重的几种方法(Lambda)

    java中给对象的List集合去重的几种方法 前言 一.lambda表达式的去重方式 二.Stream API中的collect去重方法 三.Stream API 中的distinct方法去重 前言 ...

  7. JAVA中如何将大数字或字符串放进数组

    JAVA中如何将大数字或字符串放进数组 在JAVA学习过程中字符串.数组.数字之间的 的转换经常用到,记录一些非常基础的转换. 1.将数字转换为字符串:String str = String.valu ...

  8. Java中[xxx:xxx,aaa:aaa]格式字符串解析

    Java中[xxx:xxx,aaa:aaa]格式字符串解析 String str = "[name:张三,age:18,phone:15888887777,email:15888887777 ...

  9. java 方法名相同_我们可以在Java中定义与类名称相同的方法名称吗?

    是的,可以定义一个与类同名的方法.没有编译时或运行时错误.但是,按照Java中的编码标准,不建议这样做.通常,Java中的构造函数名称和类名称始终相同. 示例public class MethodNa ...

最新文章

  1. 畅谈Perl时间处理函数用法
  2. 可以自动撑起的html样式,好好玩:CSS3抖动样式CSS Shake让你的网页酷炫起来
  3. ORACLE存储过程中计算某天所在周的周一和周日的方法
  4. “男友家里存款只有20万,我该和他结婚么?”数据告诉你多少家庭才能有20万的存款...
  5. 前端小白该如何学习?前端开发工程师掌握哪些能力
  6. scapy python_Scapy在Python脚本中
  7. java中将一个字符数组赋值给另一个,两者同时变化
  8. C# --CSkin的使用教程
  9. Oracle数据操作和控制语言详解
  10. ie浏览器出现代理服务器没有响应
  11. [原][小说]我和她同居的日子 二
  12. 最强nba体验服显示服务器正在停机,最强nba体验服安装包
  13. 测试之美(2)对测试的几点理解----谁是利益相关者?
  14. 小米盒子挂载ext4移动硬盘
  15. 查看Oracle数据库实例启动状态
  16. 第十届全球云计算大会 | 华云数据荣获“2013-2022十周年特别贡献奖”
  17. Android Connectivity分析(1)- ConnectivityManager
  18. 「音频党」你,还记得手抄歌词的年少时光吗?
  19. web前端之CSS3
  20. Ricky’s RealDan’s Ricky 博弈

热门文章

  1. 处理大并发之二 对epoll的理解,epoll客户端服务端代码
  2. Linux下使用socket传输文件的C语言简单实现
  3. linux知识(二)互斥量、信号量和生产者消费者模型
  4. 1091 N-自守数 (15 分)
  5. 987. 二叉树的垂序遍历
  6. 知乎大V推荐!面试官6个灵魂拷问,原理+实战+视频+源码
  7. df -l查看本地文件系统
  8. POJ2115 C Looooops(线性同余方程)
  9. 关于反射Assembly.Load(程序集).CreateInstance(命名空间.类)
  10. Objective-C模版方法(TemplateMethod)