本帖最后由 执笔梦 于 2014-8-5 00:01 编辑
先说静态代理吧,直接上代码: //人类接口 Publicinterface People{ //有一个吃饭方法 public void eat(); } //PeopleImpl实现人类接口,复写eat方法。 Publicclass PerpleImpl implements People{ Public void eat(){ System.out.println(“我要吃饭了!!”); } } //编写代理类同样实现people接口,并增强peopleimpl对象。 PublicPeopleProxy implements People{ PrivatePeopleImpl targer; Public PeopleProxy(PeopleImpl targer){ This.targer = targer; } //对实现的方法增强 Public void eat(){ Systme.out.println(“吃饭前去黑马论坛!!”); targer.eat(); System.out.printlm(“吃饭后也要上黑马论坛!!”); } } //测试类 Publicclass PeopleTest{ Public static void main(String args[]){ PeopleImpl people =newPeopleImple(); PeopleProxy proxy = newPeopleProxy(people); Proxy.eat(); } }
//动态 /** 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。? 按照代理的创建时期,代理类可以分为两种。? 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。?
动态代理:在程序运行时,运用反射机制动态创建而成. */
package cc.hibernate.domain; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
interface Library{ boolean addBook(String bookName); }
class LibraryImpl implements Library{ @Override public boolean addBook(String bookName) { System.out.println(bookName); return false; } } //Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类 class LibraryProxy implements InvocationHandler{ private Object target; public Object bind(Object target){ this.target = target; proxy: 代理类的对象。? 2.method:要调用的方法, 3. args:方法调用时所需的参数 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue = null; System.out.println("你要添加的功能1"); //真正提供实现服务的还是target, returnValue = method.invoke(target, args); return returnValue; }
} //这是测试, public class ProxyDemo { public static void main(String[] args) { LibraryProxy proxyInstance = new LibraryProxy(); //真正实现服务的还是这个new LibraryImpl();对象 Library libInstance = (Library) proxyInstance.bind(new LibraryImpl()); Object returnValue = libInstance.addBook("thinging in java"); System.out.println(returnValue); } } JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。 cglib我也不太会,自己网上查下
|