1.静态代理(缺点:如果有多少个被代理类的话就得有多少个代理类)
代理模式必备条件:(1)一个接口,(2)一个被代理类,(3)一个代理类
被代理类和代理类都得实现同一个接口
(1)一个接口
//创建一个接口,让被代理类去实现
public interface HelloInterface {
void say();
}
(2)一个被代理类
//被代理类
public class Hello implements HelloInterface {
@Override
public void say() {
System.out.println("Hello,我是被代理类中的C");
}
}
(3)一个代理类(静态)
被代理类对代理类里面的内容可以进行修改
//静态代理
public class HelloProxy implements HelloInterface {
HelloInterface helloInterface=new Hello();//多态
@Override
public void say() {
System.out.println("Hello,我是代理类中的A");
helloInterface.say();
System.out.println("Hello,我是代理类中的B");
}
}
运行结果为:
2.动态代理
动态代理只要修改上面的代理类就行
(3)一个代理类(动态)
动态代理类必须得实现 InvocationHandler
public class ProxyHandler implements InvocationHandler {
private Object object;
//创建一个函数,避免测试重复调用Proxy
public Object createProxy(Object object){
this.object=object;
//object.getClass() 反射的写法
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Hello,我是动态代理类中的A"+method.getName());
method.invoke(object,args);
System.out.println("Hello,我是动态代理类中的B"+method.getName());
return null;
}
}
//测试
public static void main(String[] args) {
HelloInterface helloInterface = new Hello();
ProxyHandler handler = new ProxyHandler();
HelloInterface helloInterface1= (HelloInterface) handler.createProxy(helloInterface);
helloInterface1.say();
}
运行结果:
如果新来一个被代理类,只需添加一个接口,一个被代理类,然后将被代理类注入动态代理中即可,如:
// newClass 新的被代理类
HelloInterface helloInterface1= (HelloInterface) handler.createProxy(new newClass);