我试图在代理中包装服务以模拟测试期间的延迟。以下类用于包装对象并为任何调用的方法将线程休眠100ms。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SleepyProxy<T> implements InvocationHandler {
private T wrapped;
private SleepyProxy(T toWrap) {
this.wrapped = toWrap;
}
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> T createProxy(T toWrap) {
Object proxy = Proxy.newProxyInstance(
toWrap.getClass().getClassLoader(),
toWrap.getClass().getInterfaces(),
new SleepyProxy(toWrap));
return (T) proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(wrapped, args);
nap();
return result;
}
private void nap() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
从我的测试班:
private MyService service = SleepyProxy.createProxy(ServiceProvider.getMyService());
产生以下错误:
java.lang.ClassCastException: com.sun.proxy.$Proxy33 cannot be cast to com.example.service.MyService;
请注意:
为什么我有问题转换为MyService?调试时,所有对象值似乎都排成一行。有没有更好的方法来模拟我的服务滞后? (除了为每个人提供“测试服务”之外)。
感谢您的帮助!
答案 0 :(得分:0)
问题是MyService
是一个类,而Proxy.newProxyInstance
创建的对象实现了您在第二个参数中提供的接口。让它工作MyService
需要实现接口,所以:
class MyService implements ServiceInterface
以后使用你的代理:
ServiceInterface service = SleepyProxy.createProxy(ServiceProvider.getMyService());
Proxy.newProxyInstance
与MyService
类无关,它只会在您调用方法时创建将运行InvocationHandler.invoke
的对象。