Java 如何处理作为 Runnable 传递到 Spring Boot 应用程序中单独服务类的私有方法?

问题描述 投票:0回答:1

我有一个 Spring Boot 测试类,我在其中定义了一个私有方法。我还有一个辅助服务类,它有一个简单的方法,可以接受 Runnable 并执行它。

我的期望是测试类中的私有方法无法在 Service 类中作为 Runnable 传递和运行,因为它是私有的。然而,在实践中,该方法似乎运行没有任何问题。

这是我正在做的事情的简化示例:

@SpringBootTest  
public class MyTest {  
    private void myPrivateMethod() {  
        // Some code here  
    }  
  
    @Autowired  
    private MyService myService;  
  
    @Test  
    public void myTest() {  
        myService.runRunnable(() -> myPrivateMethod());  
    }  
}  
  
@Service  
public class MyService {  
    public void runRunnable(Runnable r) {  
        r.run();  
    }  
}  

我很困惑为什么这会起作用。我认为私有方法无法在定义它们的类之外访问。任何人都可以解释为什么这是可能的吗?

java spring-boot testing
1个回答
0
投票

您没有传递私有方法。

事实上,在 Java 中你根本无法传递方法。

您正在传递

Runnable
的实现。

该实现是通过

() -> myPrivateMethod()
创建的。这是定义一些代码来实现功能接口的简单方法(如
Runnable
)。

这里的

myPrivateMethod()
只是一个无聊的旧方法调用。您定义一些代码,“恰好”调用私有方法。由于允许方法调用在这个地方,您可以创建一个Runnable来执行此操作。
您展示的代码

大致相当于

myService.runRunnable(new Runnable() { public void run() { myPrivateMethod(); } })

创建一个匿名内部类。虽然使用上面的 lambda 表达式不一定会创建一个类,但它在功能上与此代码等效。

© www.soinside.com 2019 - 2024. All rights reserved.