首页 > 代码库 > 动态代理入门(jdk)

动态代理入门(jdk)

动态代理就是aop的核心,动态代理简单的就是通过创建一个代理对象,然后把原来的方法增强。很抽象,例子是王道。jdk中提供了动态代理的实现,但是它是针对接口,如果要实现动态代理,需要被代理对象的接口。这是它的缺点,不能为了实现动态代理,都要给被代理对象写个接口,在web开发中有时很麻烦,这样就出现了通过直接改变字节码,写个子类重写需要增强的方法,但是如果这个类中的方法定义为final,它也没办法了。

1.委托类需要实现的接口

1 package 动态代理;2 3 public interface heelo {4     String sayHello();5      void sayGoodble();6 7 }

2、委托类的具体实现

 1 package 动态代理; 2  3 public class HelloImpl implements heelo{ 4  5     @Override 6     public String sayHello() { 7         // TODO Auto-generated method stub 8         return "heelo"; 9         10     }11 12     @Override13     public void sayGoodble() {14         // TODO Auto-generated method stub15         System.out.println("goodBye");16         17     }18 19 }

3.handler(advice)

package 动态代理;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class HelloHander implements InvocationHandler{    HelloImpl hip=null; //传入被代理的对象    public HelloHander(HelloImpl hip)    {        this.hip=hip;            }    @Override    //    public Object invoke(Object arg0, Method arg1, Object[] arg2)            throws Throwable {                // TODO Auto-generated method stub        System.out.println("before  "+arg1.getName());        Object res=arg1.invoke(hip, arg2);//被代理的对象原来的逻辑        System.out.println("after  "+arg1.getName());        return  res;        //此处请注意啊,执行顺序。                            }}

4.客户端

package 动态代理;import java.lang.reflect.Proxy;public class Test {    public static void main(String[] args) {        // TODO Auto-generated method stub        HelloImpl hl=new HelloImpl();//target,被代理的对象        HelloHander hh=new HelloHander(hl);//创建一个处理器,类似advice        //创建一个代理对象,为target的所有方法进行代理        heelo h=(heelo) Proxy.newProxyInstance(hl.getClass().getClassLoader(), hl.getClass().getInterfaces(), hh);        //调用sayHeelo方法        System.out.println(h.sayHello());                System.out.println();        //调用sayBye        h.sayGoodble();                    }}

 

动态代理入门(jdk)