JDK动态代理实现
JDK动态代理实现过程
代理过程:被代理类A需要实现接口C,代理类B需要实现InvocationHandler接口,重写Invoke方法(定义了代理逻辑)。
1,首先创建接口C
public interface Star {
String sign(String name,int num);
String dance(String name);
}
2,然后创建被代理类A
public class LiuDeHua implements Star {
@Override
public String sign(String name,int num) {
System.out.println(name+num);
return "唱完";
}
@Override
public String dance(String name) {
System.out.println("开心的马骝");
return "跳完";
}
}
3,通过java.lang.reflect.Proxy类去创建代理对象,入参分别为被代理类A的类加载器、A的类接口方法、代理类B的实例(此处用了匿名内部类)
LiuDeHua ldh = new LiuDeHua();
Star starProxy = (Star)Proxy.newProxyInstance(ldh.getClass().getClassLoader(),
ldh.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
System.out.println(proxy.getClass().getMethods());
System.out.println("内部类前置****"+args[0]);
Object invoke = method.invoke(ldh, args); //通过反射执行被代理对象ldh里面的方法,args参数个数必须和被代理类原方法一致
System.out.println("内部类后置****");
return "123";
}
});
System.out.println(starProxy.sign("666",1));//调用生成的代理类去执行方法sing,入参会传入Object[] args
invoke方法里面的第一个参数是生成的代理类对象,return "123"会覆盖原来方法的返回值,
而且类型必须和被代理方法返回类型一致,不然会报错。
总结:动态代理执行流程
1.底层生成一个 $ Proxy0类,严格来说生成的是$Proxy0类的字节码内容
2.代理类把被代理类中所有方法都重写,把所有方法都转去调用InvocationHandler.invoke方法
3.invoke方法中有用户自定义逻辑,也会通过method.invoke反射调用被代理对象的目标方法
4.就这样完成了代理,执行目标方法前输出一行语句,记录日志,统计耗时等都可以实现.

浙公网安备 33010602011771号