jdk动态代理

来源:互联网 发布:java就业班 编辑:程序博客网 时间:2024/05/02 23:03


jdk动态代理基于接口实现,你需要代理的对象应该实现了一个或者多个接口,这个也是因为接口的好处显而易见,接口使你程序容易扩展,耦合性更低。jdk动态代理需要用到invocationHandler,要了解动态代理了解反射是前提。还是写一个例子吧。

首先写一个接口:

package com.test.testDymanicProxy;public interface userDAO {public void save();public void talk();}

实现接口:

package com.test.testDymanicProxy;public class userImpl implements userDAO{public void save() {// TODO Auto-generated method stubSystem.out.println("user be saved");}public void talk() {// TODO Auto-generated method stubSystem.out.println("I'm talking");}}
用自己的myHandler实现invocationHandler接口,实现invoke方法:

package com.test.testDymanicProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class testHandler implements InvocationHandler{private Object target;//要代理的那个对象public testHandler(Object target){this.target=target;}public void before(){System.out.println("save before");}public void after(){System.out.println("saved after");}/** *param proxy生成代理类实例 *param method 调用方法类实例,比如你调用了save方法就是save方法实例 *param args 调用方法类实例的参数,比如你method需要传入参数,放在args里面 */public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubbefore();method.invoke(target, args);after();return null;}}
生成代理:
package com.test.testDymanicProxy;import java.lang.reflect.Proxy;public class test {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubuserDAO userdao=new userImpl();testHandler handler=new testHandler(userdao);userDAO userproxy=(userDAO)Proxy.newProxyInstance(userdao.getClass().getClassLoader(), new Class[]{userDAO.class,personDAO.class}, handler); userproxy.save(); userproxy.talk();}}
动态代理的好处很多,比如说你的方法已经写完提交,但是要在众多方法里面添加日志,如果按照传统的方法,我们可能会使用组合的方法,或者继承该类重写要改的方法,但是方法多了,你组合也要重写很多代码,继承就更不应该了,我们说要慎用继承,能不用继承就不用继承,像这种从上到下的编程方式在这好像不太方便,但是我们如果使用动态代理,你只需要将要改的类的传进handler里面,将要代理的接口传入就行了,这个也叫面向切面编程,在spring也叫AOP。

0 0