Java Dynamic Proxy без целевого объекта? - PullRequest
3 голосов
/ 27 марта 2009

Странный вопрос ...

Как я могу использовать Перехватчик Вызовов Java, как при использовании Динамических Прокси без фактического наличия целевого объекта?

Например, я хотел бы создать объект Uber, который может заменять дюжину или около того интерфейсов, указанных во время выполнения, без необходимости использования объекта, реализующего какой-либо из них.

В основном это работает как функциональность __call из большинства динамических языков.

Мысли

1 Ответ

7 голосов
/ 27 марта 2009

Возможно, я неправильно понимаю вопрос (если да, пожалуйста, дайте мне знать!), Но начнете ли вы с этим?

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class Main
{
    public static void main(final String[] argv)
    {
        final Object             object;
        final InvocationHandler  handler;
        final Runnable           runnable;
        final Comparable<Object> comparable;


        handler = new InvocationHandler()
        {
            public Object invoke(final Object   proxy,
                                 final Method   method,
                                 final Object[] args)
                throws Throwable
            {
                System.out.println(proxy.getClass());
                System.out.println(method);
                System.out.println(Arrays.toString(args));
                return (0);
            }
        };

        object = Proxy.newProxyInstance(Main.class.getClassLoader(), 
                                        new Class[] { 
                                            Runnable.class, 
                                            Comparable.class,
                                        }, 
                                        handler);

        runnable = (Runnable)object;
        runnable.run();

        comparable = (Comparable<Object>)object;
        comparable.compareTo("Hello");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...