-
静态代理: 代码在编译后不会动态变化. 举个例子: 人找工作 通过一些中介进行帮助
-
person 对象
public class Person {
public void findWork() {
System.out.println("找工作");
}
}
- 智联作为找对工作的代理
public class ZhiLian {
private Person p;
public ZhiLian(Person person) {
this.p = person;
}
public void findWork() {
// 智联帮你找工作
System.out.println("智联正在帮你寻找工作");
this.p.findWork();
System.out.println("帮你找到工作了");
}
}
- 执行方法
public class StaticProxyTest {
public static void main(String[] args) {
Person p = new Person();
ZhiLian zhiLian = new ZhiLian(p);
zhiLian.findWork();
}
}
- 执行结果
智联正在帮你寻找工作
找工作
帮你找到工作了
- 基于 JDK 进行实现
public interface ZhiYuan {
/**
* 找工作
*/
void findWork();
}
public class PersonJdk implements ZhiYuan {
@Override
public void findWork() {
System.out.println("找工作");
}
}
- 找工作的代理对象
public class ZhiLianJdk {
/**
* 被代理对象的临时保存结点
*/
private ZhiYuan target;
public Object getInstance(ZhiYuan personJdk) {
this.target = personJdk;
Class clazz;
clazz = personJdk.getClass();
// 重构一个新的对象
return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("jdk 代理的智联");
Object invoke = method.invoke(target, args);
System.out.println("工作找到了");
return invoke;
}
});
}
}
- 测试方法
public class JdkProxyTest {
public static void main(String[] args) throws Exception {
PersonJdk pjd = new PersonJdk();
Object obj = new ZhiLianJdk().getInstance(pjd);
// 注意 JDK 代理实现的是接口 并不是实现了接口的类 (PersonJdk)
ZhiYuan p = (ZhiYuan) obj;
p.findWork();
}
}
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。