先定义一个公共接口
public interface ISomeService {
public String eat();
public String sleep();
}
然后写这个接口的实现类
public class SomeServiceImpl implements ISomeService {
@Override
public String eat() {
return "eat";
}
@Override
public String sleep() {
return "sleep";
}
}
接下来写动态代理类,我们要实现这个接口 InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler {
//目标对象
private Object target ;
public Object bind(Object target){
this.target = target ;
//建立代理对象和目标对象的关系,并返回代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* proxy :代理对象
* method : 目标方法
* args : 目标方法的参数列表
*/
System.out.println("进入代理");
System.out.println("代理操作开始前");
Object object = method.invoke(target, args);
//method.invoke 本质就是通过反射,让目标对象target调用它的方法。
System.out.println("代理操作结束后");
return object;
}
}
然后我们在写测试类:
public class MyTest {
public static void main(String[] args) {
JDKProxy jdkProxy = new JDKProxy();
/*
* Object bind = jdkProxy.bind(new SomeServiceImpl());
* 我们已经知道了bind方法返回的代理对象的类型,所以写成下面这种方式
* */
ISomeService proxy = (ISomeService) jdkProxy.bind(new SomeServiceImpl());
proxy.sleep();
System.out.println("=========");
proxy.eat();
}
}
输出结果如下:
进入代理
代理操作开始前
代理操作结束后
=========
进入代理
代理操作开始前
代理操作结束后
注意事项:1、 JDK动态代理要求必须有接口。