Динамически реализуемый интерфейс 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 это был бы желаемый эффект. Хотя это, наверное, невозможно. Есть ли другие варианты? Большое спасибо!

0 ответов

Другие вопросы по тегам