首页 > 其他 > 详细

如何使用动态代理,如何使用呢?

时间:2014-03-19 12:04:16      阅读:315      评论:0      收藏:0      [点我收藏+]

如何使用动态代理,如何使用呢?

我先创建一个动态代理类


public class ProxyUser implements InvocationHandler {
private Object target;

public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("getNames".equals(method.getName()))
System.out.println("getNames is invocations");
return method.invoke(target, args);
}
}
然后我们再创建一个接口(为什么要创建接口?原因是动态代理只能代理一个实现了一个或多个接口的类)


public interface UserInterface {
public String getNames();

}
现在再创建一个实现类: tkyhyl96.com bossyl21.com wlgjyl55.com bjdylc32.com amnylc49.com


public class UserImpl implements UserInterface{
@Override
public String getNames() {
return "Leo";
}
}
一切准备就绪,现在开始调用了

?
1
2
3
4
5
public static void main(String[] args) {
ProxyUser proxyuser=new ProxyUser();
UserInterface user= (UserInterface) proxyuser.bind(new UserImpl());
System.out.println(user.getNames());
}
运行一下结果:

getNames is invocations
Leo


return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
这里是动态代理的关键,为什么要使用类加载器?原因:动态代理是在内存中动态生成一个并被加载到方法区,要加载就需要类加载器!

那为什么要使用系统类加载器?使用不同的类加载器涉及一个命名空间的问题,命名空间不同会导致无法调用,又是一个类加载方面的问题,后面我们再着重讨论下。

从上面这段代理我们可以看出动态代理的限制:被代理的类必须要实现一个或者多个接口,但是如果我们代理的类本身就是一个接口或者没有实现接口呢?

这个就要通过CGLIB来代理了,下一节就讲cglib。

如何使用动态代理,如何使用呢?,布布扣,bubuko.com

如何使用动态代理,如何使用呢?

原文:http://www.cnblogs.com/geziwu/p/3607755.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!