EasyJava
来源:互联网 发布:然足下卜之鬼乎的然 编辑:程序博客网 时间:2024/05/22 08:16
动态的生成一个对象的代理,可对于代理的访问进行控制,或限制行为,或添加行为(装饰模式)
package com.company;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.*;public class Main { public interface Sayable { void say(); } public class Bird implements Sayable { public void say() { System.out.println("bird say!"); } } public class SayableInvocationHandler implements InvocationHandler { private Sayable target; public SayableInvocationHandler(Sayable target) { this.target = target; } @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { System.out.println("o is instance of Sayable? "+(o.getClass())); System.out.println(method.getName()+" called!"); return method.invoke(target,objects); } } public static List getList(final List list) { return (List) Proxy.newProxyInstance(null, new Class[] { List.class }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("clear".equals(method.getName())) { throw new UnsupportedOperationException(); } else { return method.invoke(list, args); } } }); } public void run() { Bird b = new Bird(); Sayable proxy = (Sayable) Proxy.newProxyInstance(Main.class.getClassLoader(),new Class[]{Sayable.class},new SayableInvocationHandler(b)); proxy.say(); } public static void main(String[] args) { Main m = new Main(); m.run(); }}