静态代理
1 作用
根据OCP(对扩展 开放、对修改 关闭)的原则,在不改变原来类的基础上,给这个类增加额外的功能
2 缺点
代理对象要保证和目标对象实现同样的接口,在维护的时候两个对象都要维护,而且代理对象实现的接口是固定的,这时如果要给想实现不同功能的多个目标对象添加代理对象的话,需要添加很多个类
TestInter
package _Proxy;
public interface TestInter {
public void findHouse();
public void findCar();
}
Bingbing
package _Proxy;
public class Bingbing implements TestInter {
public void findHouse() {
System.out.println("冰冰来西三旗找房");
}
public void findCar() {
System.out.println("冰冰来西三旗找车");
}
}
ChenChen
package _Proxy;
public class ChenChen implements TestInter {
public void findHouse() {
System.out.println("晨晨去日本找房");
}
public void findCar() {
System.out.println("晨晨去日本找车");
}
}
Agent02
package _Proxy;
public class Agent02 implements TestInter {
TestInter person;
public Agent02(TestInter person) {
super();
this.person = person;
}
public void findHouse() {
System.out.println("3");
person.findHouse();
}
public void findCar() {
System.out.println("4");
person.findCar();
}
}
_Proxy_02
package _Proxy;
//代理方法----静态代理
//* 作用:可以实现代理
//* 作用:根据OCP(对扩展开放,对修改关闭)的原则,在不改变原来类的基础上,给这个类增加额外的功能
//* 缺点:代理对象要保证跟目标对象实现同样的接口,在维护的时候两个对象都要维护,
//* 而且代理对象实现的接口是死的,这时如果要给想实现不同功能的多个目标对象添加代理对象的话,要添加很多个类
public class _Proxy_02 {
public static void main(String args[]) {
test01();
}
public static void test01() {
Bingbing bingbing = new Bingbing();
Agent02 agent = new Agent02(bingbing);
agent.findHouse();
agent.findCar();
}
}
动态代理
TestInter
package _Proxy;
public interface TestInter {
public void findHouse();
public void findCar();
}
Bingbing
package _Proxy;
public class Bingbing implements TestInter {
public void findHouse() {
System.out.println("冰冰来西三旗找房");
}
public void findCar() {
System.out.println("冰冰来西三旗找车");
}
}
_Proxy_01
package _Proxy;
import java.lang.reflect.*;
public class _Proxy_01 {
public static void main(String args[]) {
test01();
}
public static void test01() {
TestInter testInter = new Bingbing();
/**
*动态生成代理对象的方法--通过JDK内置的java.lang.reflect.Proxy动态代理类完成代理对象的创建
*参数一:这里代表类加载器,代理类的类加载器要与目标类的类加载器一致,类加载器用来装载内存中的字节码文件
*参数二:代理类与目标类实现的接口必须有相同的,即指定给代理类的接口,目标类必须实现了
*参数三:代理类的构造方法生成的对象--注意:指定给构造方法的参数要使用Object
*
*/
//参数一:类加载器,参数二:接口,参数三:代理类的构造方法生成的对象
TestInter obj = (TestInter)Proxy.newProxyInstance(testInter.getClass().getClassLoader(), new Class[] {TestInter.class},
//匿名内部类
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
Object obj = method.invoke(testInter, args);
return obj;
}
}
);
obj.findHouse();
}
}