动态代理入门(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     @Override
13     public void sayGoodble() {
14         // TODO Auto-generated method stub
15         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();
        
        

    }

}
原文地址:https://www.cnblogs.com/hansongjiang/p/4006969.html