静态代理与动态代理的区别??
解决方案 »
- mysql 查询语句转换成 sqlserver2000
- 统一用户权限管理
- 请问pstmt.setString(1, "%" + name + "%");中%的作用和意思?
- struts2中的result配置,请指点。。。
- 菜鸟提问:请问这个软件下下来后只有代码.如何设置才能打开运行呢?
- java.lang.ExceptionInInitializerError错误,那位大虾看看我贴子里的内容,帮忙解决,我实在是没有方法了.
- 数据库应用怎样利用面向对象?
- struts的validator怎么就不行呢?到底是哪里不对了????
- 请教log4j的输出问题
- 谁知道“在世孔明”-“孔明在世”的联系方式?
- 求职,java软件工程师,两年工作经验
- MyEclipse配置Tomcat
//定义接口 public interface HelloWorld{ public void print();}//定义实现接口的类Public HelloWorldImpl implements HelloWorld{Public void print(){System.out.println("Hello World!");}} //定义静态代理实现接口Public staticProxy implements HelloWorld{Public HelloWorld helloWorld;Public staticProxy(HelloWorld helloWorld ){This.helloWorld=helloWorld;}Public void print(){System.out.print("Welcome!!");helloWorld.print();}} //测试静态代理Public class TestStaticProxy{Public static void main(String[] args){
HelloWorld helloWorld=new HelloWorldImpl();StaticProxy staticPro=new staticProxy(helloWorld);StaticPro.print();}}2.静态代理的缺点如果接口添加一个新的方法,所有的实现类和代理类都要做这个实现,这就增加了代码的复杂度,而动态代理就可以解决这个问题。3.动态代理3.1 动态代理和静态代理相比较,最大的好处就是接口中声明的所有的方法都被转移到一个集中的方法中去处理,这样在接口中声明的方法比较多的情况下我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。3.2 动态代理只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法的返回值是被代理接口的一个实现类。下面先看一段关于动态代理的代码:Public class DynamicProxy implements InvocationHandler{Private Object object;Public Object bindRelation(Object object ){This.object =object;Return Proxy.newProxyInstance(object. getClass_r(). getLoader_r(),object. getClass_r(). getInterfaces_r(),this);} Public Object invoke(Object object,Method method,Object[] args) throws Throwable{System.out.print("Welcome");
Object result=method.invoke(object,args);Return result ;}} //测试动态代理Public class DynamicProxy{Public static void main(String[] args){HelloWorld helloWorld=new HelloWorldImpl();DynamicProxy dynamicPro=new DynamicProxy();HelloWorld helloWorld1=(HelloWorld)dynamicPro.bindRelation(helloWorld);helloWorld1.print();}}
Cglib 是使用一种叫做 ASM 的字节码工具,由程序的方式产生字节码。