我有一个 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 中你根本无法传递方法。
您正在传递
Runnable
的实现。
该实现是通过
() -> myPrivateMethod()
创建的。这是定义一些代码来实现功能接口的简单方法(如Runnable
)。
这里的
myPrivateMethod()
只是一个无聊的旧方法调用。您定义一些代码,“恰好”调用私有方法。由于允许方法调用在这个地方,您可以创建一个Runnable
来执行此操作。您展示的代码大致相当于:
myService.runRunnable(new Runnable() {
public void run() {
myPrivateMethod();
}
})
创建一个匿名内部类。虽然使用上面的 lambda 表达式不一定会创建一个类,但它在功能上与此代码等效。