首先说下静态代理,接口 -> 实现-> 代理, 实现与代理有相同的接口。代理执行时会将实现作为参数传入,代理执行的方法其实是实现的方法,并且可以在执行此方法前后添加其它功能。
代码:
/**
* 静态代理
* Create on 2018/8/7 by wangyubing
*/
public class Main {
public static void main(String[] args) {
TaskProxy taskProxy = new TaskProxy(new WatchTelevisionTask());
taskProxy.task();
}
}
interface TaskInterface {
void task();
}
class TaskProxy implements TaskInterface{
private TaskInterface taskInterface;
TaskProxy(TaskInterface taskInterface) {
this.taskInterface = taskInterface;
}
public void task() {
System.out.println("我先吃点薯条");
taskInterface.task();
System.out.println("看完电视去打会球");
}
}
class WatchTelevisionTask implements TaskInterface {
public void task() {
System.out.println("我正在看电视");
}
}
小结:静态代理有很强的局限性,一个代理只能服务于一个方法,并不是那么好用。
jdk动态代理
java提供了java.lang.reflect.InvocationHandler接口,以此来实现动态代理,jdk动态代理必须实现接口,否则无法使用。
代码:
public class Main {
public static void main(String[] args) {
TaskInterface taskInterface = (TaskInterface) Proxy.newProxyInstance(DoTaskImplement.class.getClassLoader(), DoTaskImplement.class.getInterfaces(), new TaskProxy(new DoTaskImplement()));
taskInterface.readBook();
taskInterface.write();
}
}
class DoTaskImplement implements TaskInterface {
public void readBook() {
System.out.println("我在读书");
}
public void write() {
System.out.println("我在写字");
}
}
interface TaskInterface {
void readBook();
void write();
}
class TaskProxy implements InvocationHandler {
private Object target;
TaskProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
System.out.println("hahahahhahaha");
Object invoke = method.invoke(target, args);
System.out.println("hjaahhasdhjahjdkahskd");
return invoke;
}
}