注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

周响 廊坊师范学院九期信息技术提高班

一个世界有你 一个世界没有你 让两者的不同最大 就是你一生的意义

 
 
 

日志

 
 

动态代理与静态代理  

2014-07-31 19:48:50|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
         这两天研究aop的过程中发现在aop中用到的核心技术就是动态代理。然后找了找资料发现代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的创建时期,代理类可分为两种。
 静态代理
         所谓静态代理就是我们学的代理设计模式,由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
        静态实例:
声明接口:
/**
 * @author zx
 *
 */
public interface Person {
public void say();

}

具体实现类:


/**
* @author zx
*
*/
public class PersonImp implements Person {

public void say()
{
System.out.println("hello");
}

}


静态代理类实现:

/**
* @author zx
*
*/
public class PersonProxyStatic implements Person {
private Person per;
public PersonProxyStatic(Person per)
{
this.per=per;
}

/* (non-Javadoc)
* @see Person#say()
*/
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("开始执行代理的方法!");
per.say();
System.out.println("代理防范执行结束!");
}
public static void main(String args[])
{
PersonProxyStatic personproxy=new PersonProxyStatic(new PersonImp());
personproxy.say();
}
}



动态代理
        动态代理类,在程序运行时,运用反射机制动态创建而成。在程序运行前,代理类的.class文件不存在,当程序运行时会根据其相应的接口生成对应的代理类,即动态代理中代理类是在程序运行的过程中生成的。
动态代理实例

创建动态代理类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* @author zx
*
*/
public class PersonProxy implements InvocationHandler{
private Object person;

public Object getProxy(Object object)
{
this.person=object;

return Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return method.invoke(person, args);
}

public static void main(String[] args) {
PersonImp personimp=new PersonImp();
PersonProxy proxy=new PersonProxy();
Person personproxy=(Person)proxy.getProxy(personimp);
personproxy.say();

}
}


总结
        静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。 动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。本文中动态代理使用的是java jdk中的动态代理, 尽管动态代理相对于静态代理已经相当高效了,然而jdk这种代理模式还是有缺陷的就是严重依赖于接口,换言之JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这时候就要考虑cglib动态代理。
     
  评论这张
 
阅读(84)| 评论(10)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017