Динамически реализуемый интерфейс Java
Поэтому я пытаюсь создать небольшой Util, который позволит мне динамически реализовывать интерфейс на Java. Под этим я подразумеваю, что я хотел бы взять объект и принудительно перенести его в другой объект. Очевидно, что это невозможно, если не присутствуют все необходимые методы. Вот чем я сейчас занимаюсь:
@SuppressWarnings("unchecked")
public static <T> T become(T implementation, Object target) {
Class<?>[] interfaces;
if (implementation.getClass().isInterface())
interfaces = new Class<?>[]{implementation.getClass()};
else
interfaces = implementation.getClass().getInterfaces();
return (T) Proxy.newProxyInstance(implementation.getClass().getClassLoader(), interfaces, (proxy, method, args) -> {
method.setAccessible(true);
for (Method declaredMethod : implementation.getClass().getDeclaredMethods())
if (method.getName().equals(declaredMethod.getName()) && Arrays.equals(method.getParameterTypes(), declaredMethod.getParameterTypes()))
return method.invoke(implementation, args);
return method.invoke(target, args);
});
}
Хотя он работает просто отлично, у него есть один огромный недостаток. Как только вы начинаете использовать более продвинутые интерфейсы и начинаете иметь подобные случаи, начинаются проблемы.
IFaceA extends IFaceB
IFaceC extends IFaceB, IFaceD
ClassA implements IFaceA
become(new ClassA(), new IFaceC(){
//billions of methods
});
в таком случае вы действительно хотите просто реализовать методы, объявленные в IFaceD
но вы вынуждены внедрять методы из IFaceB
, а также IFaceD
, Если бы можно было как-то обмануть ide / compiler, заставив его думать об экземпляре new IFaceC
был на самом деле экземпляр класса, который расширяет ClassA
и реализует IFaceC
это был бы желаемый эффект. Хотя это, наверное, невозможно. Есть ли другие варианты? Большое спасибо!