使用反射生成JDK动态代理
1.使用Proxy和InvocationHandler创建动态代理
(1)Proxy提供了用于创建动态代理类和动态代理对象的静态方法,他也是所有动态代理类的父类。
(2)如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,如果需要为一个或多个接口动态的创建实例,也可以使用Proxy来创建动态代理实例。
(3)Proxy提供了两个方法来创建动态代理类和动态实例:
1)static Class<?> getProxyClass(ClassLoader loader,Class<?>...interface):
创建一个动态代理类所对应的Class对象,该代理类将实现interface所指定的多个接口。第一个 ClassLoader参数指定生成动态代理类的类加载器;
2)static Object newProxyInstance(ClassLoader laoder,Class<?>[] interface,InvocationHandler h):
直接创建一个动态代理对象,该代理对象的实现类实现了interface指定的系列接口,执行代理对象的每个 方法时都会被替换执行InvocationHandlerd对象的invoke方法;
(4)使用Proxy和InvocationHandler生成动态代理对象
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //定义一个接口 interface Person{ void walk(); void sayHello(String name); } //实现InvocationHandler接口的类 class MyInvocationHandler implements InvocationHandler{ /* * 执行动态代理的所有方法时,都会被替换成如下的invoke方法 * proxy——动态代理对象 * method——正在执行的方法 * args——调用目标方法时所传入的参数 */ //InvocationHandler中所需实现的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("正在执行的方法:"+method); if(args!=null){ System.out.println("下面是执行该方法时传入的参数:"); for(Object val:args){ System.out.println(val); } }else{ System.out.println("调用该方法没有实参!"); } return null; } } public class ProxyTest { public static void main(String[] args)throws Exception{ //创建一个InvocationHandler对象 InvocationHandler handler = new MyInvocationHandler(); //使用指定的InvocationHandler来生成一个动态代理对象 Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler); //调用动态代理对象的方法 p.walk(); p.sayHello("aaa"); } }
2.动态代理和AOP
用于方便代码的复用以及后期修改(暂时想到的)。
时间: 2024-12-29 23:24:21