package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
PersonBean 林黛玉 = new PersonBeanImpl(2199L, "林黛玉");
PersonBean 林黛玉的代理 = getPersonBeanProxy(林黛玉);
林黛玉.print("林黛玉begin");
林黛玉的代理.print("林黛玉的代理begin");
林黛玉的代理.setName("潇湘妃子");
林黛玉的代理.print("林黛玉的代理end");
林黛玉.print("林黛玉end");
}
private static PersonBean getPersonBeanProxy(PersonBean person) {
Object obj = Proxy.newProxyInstance(
person.getClass().getClassLoader(),
person.getClass().getInterfaces(),
new PersonInvocationHandler(person));
return (PersonBean) obj;
}
}
interface PersonBean {
public String getName();
public void setName(String name);
public void print(String tag);
}
class PersonBeanImpl implements PersonBean {
final private long id;
private String name;
public PersonBeanImpl(long id, String name) {
this.id = id;
this.name = name;
}
@Override
public String getName() {
System.out.println("getName()被调用, id="+id);
return name;
}
@Override
public void setName(String name) {
System.out.println("setName()被调用, id="+id);
this.name = name;
}
@Override
public void print(String tag) {
System.out.println("我的自述:id="+id + ", name="+name + ", tag="+tag);
}
}
class PersonInvocationHandler implements InvocationHandler {
private PersonBean personBean;
public PersonInvocationHandler(PersonBean personBean) {
this.personBean = personBean;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在这里可以做一些偷梁换柱、欺上瞒下的事情
return method.invoke(personBean, args);
}
}
玩具代码:java动态代理
最新推荐文章于 2022-09-30 17:23:24 发布