怎么理解这个代理

hailun 2008-02-25 08:50:21
public interface Computer {
public void buy();
}


public class ComputerImpl implements Computer {

public void buy() {
System.out.println("给啥要啥");
}

}


public class DaiLi implements InvocationHandler {
Object obj;
public Object bind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); //这里返回的是什么呢?里面的三个参数被代理对象,还是本类的这个对象呢
}
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { //这个方法什么时候执行的呢,并没有哪个对象调用它啊,里面的三个参数代表什么意思呢 System.out.println("您想要啥"); //没被调用为什么会输出呢
Object result = arg1.invoke(obj, arg2); //这个方法什么时候执行的呢,也没有对象调用它啊,arg1,arg2又是什么意思呢 return result;
}

}


public class Demo {
public static void main(String[] args) {
DaiLi dl = new DaiLi();
Computer c = (Computer)dl.bind(new ComputerImpl());
c.buy();
}

}



为什么要使用代理呢?代理会带来什么好处吗?在什么情况下使用代理呢?
最后输出的时候"您想要啥"怎么会被输出出来,而且是在"给啥要啥"之前输出呢
...全文
43 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
代理是一种设计模式,用于在方法上添加其他的功能,也就是在方法体内添加新的东西,
一般用于AOP(面向切面程序设计),比如,在已有的代码中添加方法执行时间的功能,
就可以在方法调用前和调用后做这件事情。

而这一句:
Object result = arg1.invoke(obj, arg2);
就是使用反射调用原来的方法,可以在它的前面或者是后面增加新的内容,因为在使用时用了
bind进行绑定,所有被绑定的对象都会这样进地调用。

在数据库连接池中就要使用到代理,比如,一般性调用Connection的close方法,是将连接
关闭,但是在连接池中close并不是将连接关闭,而是将它放回到池中去,这样就可以通过代
理将close原本的行为给屏蔽掉。

    public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
if(!method.getName().equals("close")) {
// 不是调用close方法时,继续做原本的事情
obj = method.invoke(con, args);
}else{
// 是close方法时,将连接归还到池中
}
return obj;
}


PS:Java的动态代理有个局限性,被代理的类必须要有一个接口。而其他的工具,比如:CGLib就没有这种限制。
bloodrate 2008-02-25
  • 打赏
  • 举报
回复
关注中。。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧