当前位置: 首页 > 知识库问答 >
问题:

从Apache Commons-lang3中调用私有静态方法

刘博文
2023-03-14

可以用MethodUtils调用私有静态方法吗?

 LocalDateTime d = (LocalDateTime)MethodUtils.invokeStaticMethod(Service.class,
     "getNightStart",
      LocalTime.of(0, 0),
      LocalTime.of(8,0));

此代码引发异常:

java.lang.NoSuchMethodException: No such accessible method: getNightStart()

如果我将方法的访问修饰符更改为public,它就会工作。

共有2个答案

丰博
2023-03-14

使用带有forceAccess的方法,并设置true

apidoc for con-lang3 metodUtils.invoke方法

袁谭三
2023-03-14

不,因为metodUtils.invoke静态方法()在引擎盖下调用Class.get方法()。即使您尝试破解修饰符,它也不会对metodUtils可见,因为它看不到修改后的方法引用:

Service.class
  .getDeclaredMethod("getNightStart", LocalTime.class, LocalTime.class)
  .setAccessible(true);
MethodUtils.invokeStaticMethod(Service.class, 
   "getNightStart", LocalTime.of(0, 0), LocalTime.of(8, 0)); 

仍然会失败,而NoSuchMethodException就像普通反射一样:

Service.class
  .getDeclaredMethod("getNightStart", LocalTime.class, LocalTime.class)
  .setAccessible(true);
Method m = Service.class.getMethod("getNightStart", LocalTime.class, LocalTime.class);
m.invoke(null, LocalTime.of(0, 0), LocalTime.of(8, 0));

这仅在重用方法对象时有效:

Method m = Service.class.getDeclaredMethod("getNightStart", LocalTime.class, LocalTime.class);
m.setAccessible(true);
m.invoke(null, LocalTime.of(0, 0), LocalTime.of(8, 0));
 类似资料:
  • 我想知道是否有一种方法来验证和调用一个模拟,该模拟是为一个私有静态方法创建的,该私有静态方法是从一个被测试的公共静态方法调用的。 下面是我正在测试的公共静态方法 我已经使用powermokito对私有静态方法进行了如下嘲弄:

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 问题内容: 您如何看待使用 私有静态方法 ? 就个人而言,我更喜欢使用 静态 私有方法而不 是非 静态 方法,只要它不需要访问任何实例字段即可。 但是我听说这种做法违反了OOP原则。 编辑:我想从样式的角度来看,而不是性能。 问题答案: 一个方法本身本身并没有违反OOP,但是当类上有很多不需要(也不能*)访问实例字段的方法时,您就不会以OO方式进行编程,因为“对象”表示状态+一起定义的状态操作。如

  • 为什么会这样?我的意思是,访问私有变量。

  • 问题内容: 我想调用一个私有静态方法。我有名字 我听说可以使用Java反射机制来完成。我该怎么做? 编辑: 我在尝试调用该方法时遇到的一个问题是如何指定其参数的类型。我的方法收到一个参数,其类型为Map。因此,我不能这样做(在运行时,由于Java Type擦除,没有Map这样的东西)。是否有另一种方法来获得该方法? 问题答案: 假设您要调用MyClass.myMethod(int x);

  • 如何验证是否调用了私有嵌套类的非静态方法?这就是我目前的情况: 我明白了: 更新1: @丹尼斯,我试过以下方法,不过我得到了一个。我想根据JVM中已经存在的单例验证方法的运行,而不是创建它的新实例(正如我在下面的代码中所做的那样),以便调用方法。我尝试调用,但没有成功。有没有一种方法可以使用外部类的运行实例上的反射来验证jmockit中对私有嵌套类中非静态方法的调用(通过调用)? 更新2: 尝试获