动机:对象创建开销很大,某些操作需要安全控制,或者需要进程外的访问
class IA{
public void precess();
}
class A implements IA{
@Override
public void precess(){...}
}
class ClientApp{
IA ia;
public void doingSomething(){
...
ia=new A();
ia.precess();
...
}
}
这里需要利用代理模式,也就是利用一个代理类,在调用方法的时候,在方法调用前后帮你做你想做的事情
class IA{
public void precess();
}
class A implements IA{
@Override
public void precess(){...}
}
class AProxy {
A a;
public AProxy(){
a=new A();
}
public void precess(){
//加个密
...
a.precess();
...
}
}
class ClientApp{
IA ia;
public void doingSomething(){
...
ia=new AProxy();
ia.precess();
...
}
}
实际上的静态代理代理一个方法必须要实现一个代理的类,如果代理类方法多了就对性能有影响,这时候可以改为动态代理,动态代理也应用的更加广泛,利用代理生成器生成代理类,也称为动态代理
class IA{
public void precess();
}
class A implements IA{
@Override
public void precess(){...}
}
class MyProxy{
Object object;//JDK动态代理必须这里有接口,如果没有就需要用CGLIB动态代理
public MyInvocationHandle(Object object){
this.object=object
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(), (proxy, method, args)
->
{
...
Object o = method.invoke(object, args);
...
return o;
});
}
class ClientApp{
IA ia;
public void doingSomething(){
...
ia=(A)new MyProxy(new A()).getProxyInstance();
ia.precess();
...
}
}
这里MyProxy方法中getProxyInstance相当于返回了一个动态的代理类实例,实际项目开发中JDK动态代理是这样的
实现类
然后使用,使用时可以将Proxy调用封装到JDKProxy中
如果没有Interface,那么只能使用CGLIB方法创建
使用
使用时也可以将main方法中的实现放入CglibProxy类当中封装起来