在静态代理中,必须有已知的代理类,并且每一个类若是想要一个代理类的话都得从新写,这样的代码量以及后期的维护量都太大了,为了解决这个麻烦,咱们使用动态代理java
既然动态代理解决了静态代理的麻烦,那么必然的,咱们不须要为每个类都写一个代理类了,由于代理类是自动生成的。jdk的动态代理是基于接口的,因此,首先咱们仍是须要一个接口数组
/** * Created by lidongyang on 2017/8/22 0022. */ public interface Person { void getMsg(String name); }
接着,目标类是必须的了。目标类要实现上述接口的ide
/** * Created by lidongyang on 2017/8/22 0022. */ public class SuperStar implements Person{ //目标方法 public void getMsg(String name){ System.out.println("我叫"+ name +",我是个明星"); } }
接下来,咱们不须要本身再写代理类了,可是咱们须要写一个中介类(目标类与代理类之间的中介类),不过不要担忧,这个类咱们只要写一次就够了。测试
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * Created by lidongyang on 2017/8/22 0022. */ public class Hanlder<T> implements InvocationHandler { //目标类 private T t; public Hanlder(T t){ this.t = t; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //目标方法执行前的一些代码 System.out.println("-------------before------------"); System.out.println("方法名:" + method.getName()); System.out.print("参数:"); for (int i =0;i<args.length;i++){ System.out.print(args[i]); } System.out.println(); //执行目标方法 Object result = method.invoke(t,args); //目标方法执行后的一些代码 System.out.println("返回值:" + result); System.out.println("-------------after------------"); return result; } }
接着,咱们来测试一下this
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * Created by lidongyang on 2017/8/21 0021. */ public class LockTest{ public static void main(String[] args) { InvocationHandler handler = new Hanlder(new SuperStar()); //生成代理类 //第一个参数:代理类的类加载器 //第二个参数:目标类实现的接口类数组 //第三个参数:就是上面的hanlder Person person = (Person)Proxy.newProxyInstance(handler.getClass().getClassLoader(), new Class[]{Person.class}, handler); //经过代理类执行目标方法 person.getMsg("林志玲"); } }
输出为.net
看到这里,有没有发现,这其实就是个Spring AOP的简单实现代理
cglib动态代理地址:https://my.oschina.net/u/3410701/blog/edit/1518888blog