【问题标题】:How to refer a private method for a Supplier or Consumer in java如何在java中为供应商或消费者引用私有方法
【发布时间】:2020-02-11 14:39:38
【问题描述】:

我想重用一段用另一个类A的Private方法编写的代码。喜欢

class A
{
  private String method(String data){
return "abcd";
}
}

List myList= getListFromSomeSource();
myList.stream()
.map(A::method)
.collect()....etc

【问题讨论】:

  • 你不能在定义它的类之外使用私有方法。docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • 您可以使用reflection 进行操作。但这样做通常是一个非常糟糕的主意。
  • 你能在 A 类中修改任何东西或添加东西吗?
  • 是的:为什么班级A' 如此隐秘? method 不能是 public 而不是 private 吗?它真的在做任何非常私密的事情,以至于无法与世界其他地方分享吗?
  • @Jrook 我不是在寻找类似你的链接的东西。我不想创建对象,只想引用方法。我不能修改 A 类。 - 它在一个库中。我不想重写该方法中的逻辑。只是在寻找一种重复使用它的方法。

标签: java java-8 reference


【解决方案1】:

如果类实现不提供此类选项并且无法修改该实现,则访问类的 private 方法的唯一方法是通过反射。

假设A类的method函数有一个String返回类型,一个简单的方法是

public static String invokeMethod(A object, String data) throws Exception {
  Method method = A.class.getDeclaredMethod(“method”, String.class);
  method.setAccessible(true);
  return (String) method.invoke(object, data);
}

由于所讨论的 Class A 方法不是静态的,因此需要使用对象引用来访问它,无论是否有反射,例如

A object = new A(); // Create object of type A
String data = “...”; // Specify data input
String result = invokeMethod(object, data); // Call method

如果无法创建此类A 类型的对象,或者调用者不想将此类对象的引用传递给invokeMethod,则剩下的唯一选择实际上是重写method 函数,外面Class A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2015-04-09
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2015-09-24
    • 2019-09-27
    相关资源
    最近更新 更多