JDK动态代理
在继续探究前,先简单带过一下动态代理。 代理模式主要功能是为了增强一个类中的方法诞生的一种设计模式。 而代理模式分为动态代理和静态代理,动态代理的代理类是在运行时生成的,而静态代理是在编译时生成的。动态代理可以分为基于接口的JDK动态代理和基于类的Cglib动态代理。
下面讲解一下基于JDK的动态代理: 在 java 的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。
public interface Person { void work(); } public class Student implements Person { @Override public void work() { System.out.println("读书"); } } public class MyInvocationHandler implements InvocationHandler { //增强的目标类 private Person person; public MyInvocationHandler(Person person) { this.person = person; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("先吃饭-----再看书"); method.invoke(person, args); return null; } } public class Main { public static void main(String[] args) { Person person = new Student(); MyInvocationHandler myInvocationHandler = new MyInvocationHandler(person); System.out.println(Arrays.toString(Student.class.getInterfaces())); Person proPerson = (Person) Proxy.newProxyInstance(Student.class.getClassLoader(), Student.class.getInterfaces(), myInvocationHandler); proPerson.work(); } }