Java: создать новую реализацию типа во времени выполнения?

Я думаю, что Вы, возможно, неправильно поняли то, что означает сцепление. Класс, который реализован с точки зрения нескольких других классов, не обязательно имеет низкое сцепление, пока это представляет ясное понятие и имеет ясную цель. Например, Вы можете иметь class Person, который реализован с точки зрения классов Date (для даты рождения), Address, и Education (список школ, человек перешел в). Можно обеспечить обертки в Person для получения года рождения, последняя школа, человек перешел в, или состояние, где он живет, чтобы не представлять то, которое Person реализовано с точки зрения тех других классов. Это уменьшило бы связь, но она сделает Person не менее связный.

6
задан Sbodd 20 October 2009 в 19:23
поделиться

2 ответа

Вот очень упрощенная реализация (недостаточно хороша для того, что вы хотите сделать, но с некоторыми настройками ... Главное, на что следует обратить внимание, это проблемы с загрузчиком классов, тогда могут быть могут возникнуть проблемы с проверкой и т. д.) Я использую код для тестирования, поэтому это не совсем то, что нужно для производственного качества.

    @SuppressWarnings("unchecked")
    public static <T> T generateProxy(Object realObject, Class<?>... interfaces) {
        return (T) Proxy.newProxyInstance(realObject.getClass().getClassLoader(), interfaces, new SimpleInvocationHandler(realObject));
    }


    private static class SimpleInvocationHandler implements InvocationHandler {
        private Object invokee;

        public SimpleInvocationHandler(Object invokee) {
            this.invokee = invokee;
        }

        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            method = invokee.getClass().getMethod(method.getName(), method.getParameterTypes());
            if (!method.isAccessible()) {
                method.setAccessible(true);
            }
            try {
                return method.invoke(invokee, args);
            } catch (InvocationTargetException e) {
                throw e.getTargetException();
            }
        }
    }
3
ответ дан 17 December 2019 в 07:06
поделиться

Вам понадобится ASM .

Из asm-guide.pdf :
2.2.3 Создание классов
Единственный необходимый компонент для создания класса - это компонент ClassWriter. Давайте рассмотрим пример, чтобы проиллюстрировать это. Рассмотрим следующий интерфейс:

package pkg;
public interface Comparable extends Mesurable {
  int LESS = -1;
  int EQUAL = 0;
  int GREATER = 1;
  int compareTo(Object o);
}

Его можно сгенерировать с помощью шести вызовов методов для ClassVisitor:

ClassWriter cw = new ClassWriter(0);
cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE,
    "pkg/Comparable", null, "java/lang/Object",
    new String[] { "pkg/Mesurable" });
cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "LESS", "I",
    null, new Integer(-1)).visitEnd();
cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "EQUAL", "I",
    null, new Integer(0)).visitEnd();
cw.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, "GREATER", "I",
    null, new Integer(1)).visitEnd();
cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "compareTo",
    "(Ljava/lang/Object;)I", null, null).visitEnd();
cw.visitEnd();
byte[] b = cw.toByteArray();
1
ответ дан 17 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: