Jdk动态代理
代理方式有两种静态代理和动态代理(Jdk动态代理、cglib动态代理)。本次只简单说下Jdk动态代理的实现方式,具体如下:
Jdk动态代理实现方式:
/**
* create by qsding@sina.cn
*/
package com.qsding.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @description Java动态代理测试
* @author qsding
* @date 2018年3月15日 下午10:29:30
*/
public class TestDynamicProxy {
public static void main(String[] args) {
Hello hello = new HelloImpl();
DynamicProxy proxy = new DynamicProxy(hello);
Hello helloProxy = proxy.getProxy();
helloProxy.sayHi("qsding");
}
}
/**
* @description 代理类,jdk动态代理必须实现InvocationHandler接口
* @author qsding
* @date 2018年3月15日 下午10:47:36
*/
class DynamicProxy implements InvocationHandler {
/** 被代理对象 */
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
/**
* 重写invoke方法
* @param proxy 代理对象
* @param method 被代理对象方法
* @param proxy 被代理对象方法参数
* @return Object 被代理对象方法返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
startTime();
Object result = method.invoke(target, args);
endTime();
return result;
}
private void startTime() {
try {
System.out.println("start time:" + System.currentTimeMillis());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void endTime() {
System.out.println("end time:" + System.currentTimeMillis());
}
/**
* 获取代理对象
* @return
*/
@SuppressWarnings("unchecked")
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(
this.target.getClass().getClassLoader(), // 获取被代理对象的类加载器
this.target.getClass().getInterfaces(), // 获取被代理对象的接口
this);// 被代理对象
}
}
/**
* @description 接口
* @author qsding
* @date 2018年3月18日 下午10:51:15
*/
interface Hello {
void sayHi(String str);
}
/**
* @description 接口实现类(业务处理)
* @author qsding
* @date 2018年3月18日 下午10:51:26
*/
class HelloImpl implements Hello {
@Override
public void sayHi(String str) {
System.out.println("hello ," + str);
}
}