public interface RealApi {
@GET("api1")
Observable<String> api1();
@GET("api2")
Observable<String> api2();
@GET("api3")
Observable<String> api3();
//...其他方法
}
@MockApi
public abstract class MockApi implements RealApi {
Observable<String> api3() {
return Observable.just("mock data");
}
}
RealApi api = MockManager.build(realApi, MockApi.class);
Caused by: java.lang.UnsupportedOperationException: can't load this type of class file at java.lang.ClassLoader.defineClass(ClassLoader.java:520) at java.lang.reflect.Method.invoke(Native Method) at javassist.util.proxy.FactoryHelper.toClass2(FactoryHelper.java:182)
@Target(ElementType.TYPE)
@Documented
@Retention(RetentionPolicy.SOURCE)
public @interface MockApi {
}
// 生成的类名使用原类名+"$Impl"的后缀来命名,避免和其他类名冲突,后面也使用该约束进行反射来调用该类
public final class MockApi$Impl extends MockApi {
@Override
public Observable<String> api1() {
throw new IllegalStateException("api1() is an abstract method!");
}
@Override
public Observable<String> api2() {
throw new IllegalStateException("api2() is an abstract method!");
}
}
// 获得生成代码构造的对象
private static <T> T getImplObject(Class<T> cls) {
try {
return (T) Class.forName(cls.getName() + "$Impl").newInstance();
} catch (Exception e) {
return null;
}
}
public static <Origin, Mock extends Origin> Origin build(final Origin origin, final Class<Mock> mockClass) {
// 如果 Mock Class 标记为关闭,则直接返回真实接口对象
if (!isEnable(mockClass)) {
return origin;
}
final Mock mockObject = getImplObject(mockClass);
Class<?> originClass = origin.getClass().getInterfaces()[0];
return (Origin) Proxy.newProxyInstance(originClass.getClassLoader(), new Class[]{originClass}, new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
// 获取定义的抽象类中的同名方法,判断是否已经实现
Method mockMethod = null;
try {
mockMethod = mockClass.getDeclaredMethod(method.getName(), method.getParameterTypes());
} catch (NoSuchMethodException ignored) {
}
if (mockMethod == null || Modifier.isAbstract(mockMethod.getModifiers())) {
return method.invoke(origin, objects);
} else {
return mockMethod.invoke(mockObject, objects);
}
}
});
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有