"静态反射"在java中如何工作?(例如在mockito或easymock中)

Rom*_*ier 5 c# java reflection easymock mockito

我是一个.NET人 - 我主要使用C#编写代码.

从C#3.0开始,我们可以利用lambda表达式和表达式树来使用静态反射.例如,可以GetMethodName在以下代码段中实现返回参数中传递的方法的名称:

string methodName = GetMethodName( o => o.DoSomething());
Console.WriteLine(methodName); // displays "DoSomething"
Run Code Online (Sandbox Code Playgroud)

现在,当我在Java世界中查看Mockito样本(或EasyMock样本)时,我看到:

LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

when方法如何工作?它mockedList.get(0)是如何解释为对get方法的调用,0作为参数而不是作为值传递

Jon*_*eet 5

模拟库通常不使用表达式树.它们构建了一个实现适当接口的类型,并通过记录它们或验证它们并返回预编程的响应来响应方法调用.这通常使用代理(例如,.NET中的RealProxy,Java中的代理)或动态代码生成来完成.

在EasyMock的情况下,它使用Proxy(对于接口,无论如何),正如您在源代码中看到的那样:看看org.easymock.internal.JavaProxyFactory.