没有目标对象的Java动态代理?

3

比较奇怪的问题...

如果不需要实际存在的目标对象,我该如何利用Java的调用拦截器(Invocation Interceptor)来实现像使用动态代理一样的功能呢?

例如,我想创建一个“超级对象”,可以在运行时代替指定的十几个接口而不一定需要实现它们的任何一个对象。

基本上这与大多数动态语言中的 __call 功能类似。

有什么想法吗?

1个回答

7
也许我误解了问题(如果是这样,请告诉我!),但这个能帮助你开始吗?
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");
    }
}

如果真是那么简单,我得好好反省一下自己。 - Allain Lalonde
返回(0)的事情有点棘手 - 您必须为每种方法返回适当的类型(因此对于运行而言是null,对于compareTo而言是in)。此外,在compareTo中可以做什么并不是很清楚 :-) 但除此之外,我相信它就是那么简单。 - TofuBeer
我一直知道有一天这些知识会派上用场... :-) - TofuBeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接