动态代理的作用
动态代理可以在要执行的目标方法前后扩展新的功能
说白了就是动态扩展方法功能,不需要修改代码
这样我们可以用来统计方法的执行时间,记录日志等等操作。也可以用来rpc远程调用
实现方法
- 代理接口
jdk动态代理只能代理接口,所以必须要创建接口
package com.jsong.wiki.dynamic.proxy.service;
/**
* @Author: Jsong
* @Date: 2020/4/30 15:05
* @Description:
*/
public interface Target {
void hello();
}
- 实现类
package com.jsong.wiki.dynamic.proxy.service;
/**
* @Author: Jsong
* @Date: 2020/4/27 17:20
* @Description:
*/
public class TargetImpl implements Target {
@Override
public void hello(){
System.out.println("hello invoke");
}
}
- 代理类
实现InvocationHandler接口
invoke是动态代理执行的方法
package com.jsong.wiki.dynamic.proxy.clazz;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @Author: Jsong
* @Date: 2020/4/27 17:07
* @Description:
*/
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Long beginTime = System.currentTimeMillis();
System.out.println("---------------invoke methods----------");
method.invoke(object,args);
Long time = System.currentTimeMillis() - beginTime;
// System.out.println(time);
System.out.println("-------------done----------------");
return null;
}
}
通过 Proxy.newProxyInstance(classloader,interface,handle)获取代理实例,调用需要执行的方法
package com.jsong.wiki.dynamic.proxy;
import com.jsong.wiki.dynamic.proxy.clazz.DynamicProxy;
import com.jsong.wiki.dynamic.proxy.service.Target;
import com.jsong.wiki.dynamic.proxy.service.TargetImpl;
import java.lang.reflect.Proxy;
/**
* @Author: Jsong
* @Date: 2020/4/27 16:48
* @Description:
*/
public class DynamicProxyApplication {
public static void main(String[] args) {
Target targetImpl = new TargetImpl();
DynamicProxy dynamicProxy = new DynamicProxy(targetImpl);
Target targetProxy = (Target) Proxy.newProxyInstance(targetImpl.getClass().getClassLoader(),
targetImpl.getClass().getInterfaces(),
dynamicProxy);
targetProxy.hello();
}
}