当前位置: 首页 > 面试题库 >

如何在不使用方法字符串名称的情况下获取Java中的Method对象

吕森
2023-03-14
问题内容

我正在寻找一种从方法中获取Method对象的便捷解决方法。这个想法:

Method fooMethod = getMethod( new MyObject().foo() ) // returns method "foo" in MyObject

一种明显的方法是将方法的名称用作字符串:

Method fooMethod = MyObject.class.getMethod("foo")

但我想避免这种情况,因为如果我重命名foo(),该代码将停止工作,或者在所有使用该字符串的地方都重命名了该字符串。

用例是我想使用类似于ProperyChangeListeners的东西,但是那些依赖于方法名的字符串。我想(安全地)使用实际方法而不依赖字符串。

我可以使用什么来以 重命名安全的 方式获得该方法?

更新 :我想找到一个不依赖IDE功能的纯Java解决方案


问题答案:

实际上,有一个库可以做到这一点:

Jodd MethRef-强类型方法名称引用

https://jodd.org/ref/methref.html

Methref<Str> m = Methref.on(Str.class);  // create Methref tool

// example #1
m.to().boo();
m.ref();                               // returns String: 'boo'


 类似资料:
  • 问题内容: 如何通过反射找出方法的字符串名称是什么? 例如给出: 我想获取字符串“ getFoo”,如下所示: 问题答案: 由于方法本身不是对象,因此它们没有直接的属性(就像您希望使用JavaScript之类的一流函数那样)。 您能做的最接近的是致电 是一个对象,您可以使用它调用任何反射方法。 但是,据我所知,一种方法无法识别自己。

  • 我用了这段代码并运行,但没有输出出来不知道为什么? 但如果正在使用s=“”;则也没有输出。 但是当我使用s=“”;那么输出就来了,为什么会这样呢?

  • 我需要使replace方法将该文本行中的开始(包括)和结束之间的字符替换为指定字符串片段中的字符(独占,即索引end-1之前的字符将被替换)。我不能直接或间接地使用StringBuffer类替换(int start,int end,String fragment)方法。我正在尝试使eline.replace(0,3,“abc”);或eline.replace(0,3,“ABC”);工作。

  • 问题内容: 我需要在检查的同时将以下更改为- ,以改善圈复杂度。 但是我不确定我将获得什么价值。 问题答案: Java(版本7之前的版本)在switch / case中不支持String。但是您可以通过使用枚举来达到预期的结果。

  • 问题内容: 在C#中,我们有和有或没有命名空间(包在Java世界中)得到一个类型(类在这种情况下)的名称。 java等于什么? 显然,有比手动使用和删除软件包名称更好的方法。 问题答案: 返回源代码中给定的基础类的简单名称。如果基础类是匿名的,则返回一个空字符串。 数组的简单名称是组件类型的简单名称,后接“ []”。特别是其组件类型为匿名的数组的简单名称为“ []”。 它实际上是从名称中删除软件包

  • 问题内容: 如何将字符串中的字符随机播放(例如,hello可能是ehlol或lleoh或…)。我不想使用该方法,有没有更简单的方法? 问题答案: 我不知道更简单。但是您可以使用Math.rand()功能生成字符长度范围内的随机数,而无需替换,这将给您带来混乱的输出