在Java中,实现动态代理一般需要以下几个步骤
-
写一个getProxy(final 被代理对象类名 参数名)方法
-
通过Proxy.newProxyInstance(loader, interfaces, h)创建一个proxy代理对象
loader:表示被代理对象的类加载器,通过类名.getClass().getClassLoader();获得
interfaces:表示被代理对象的所有父类接口,通过类名.getClass().getInterfaces();获得
h:表示一个InvocationHandler抽象类对象,通过new获得,并且需要实现其下的抽象方法
invoke(Object proxy, Method method, Object args[])
其中proxy是给jdk使用的,任何情况下都不要去使用它;method是被代理对象所要实现的方法;args[]是实现方法的具体参数
然后在invoke中使用method.invoke(被代理对象,args[])即可实现动态代理
注:在实现h对象的时候,必须要把method.invoke方法执行得到的值返回出去,这个返回值,就是程序运行的结果
这样就能够实现动态代理,在method.invoke()方法执行前后添加日志记录即可实现低耦合的日志记录,也可以进行其他需求操作
不过动态代理有一个缺陷,就是被代理对象必须实现一个接口才能实现动态代理,如果不想实现接口