动态的生成一个对象的代理,可对于代理的访问进行控制,或限制行为,或添加行为(装饰模式)
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();
}
}