1. 程式人生 > >proxy 動態代理 靜態代理

proxy 動態代理 靜態代理

什麼是代理 就是在不改變原來程式碼的前提下 為原來的程式碼增加新的功能

作用解耦

增加可維護性

 

 

動態代理和靜態代理的區別

動態代理不用頻繁的建立代理類

減小消耗  提高效能

動態代理代理的類是活的(可變的) 靜態代理是死的(不可變的)

 

先寫靜態代理  先死後活,死去活來

 

首先建立介面

package StaticProxy;

public interface User {
void eat(String eat);
}


然後創實現類

public class UserImp implements User {
@Override
public void eat(String eat) {
System.out.println("我要吃"+eat);
}
}

代理類

public class ProxyUser  implements User{

private UserImp user=new UserImp();

@Override
public void eat(String eat) {
System.out.println("之前增加的");
user.eat(eat);
System.out.println("之後增加的");
}
}

以上就完成了
讓我們來測試吧


public class Text {
public static void main(String[] args) {
ProxyUser proxyUser = new ProxyUser();
proxyUser.eat("肉");
}
}

列印結果


之前增加的
我要吃肉
之後增加的

 

動態代理

 

 

首先需要建立一個介面

這個藉口代表 需要進行代理的類

 

public interface TextInt {
public void rent();

public void hello(String str);
}

建立TextInt的實現類


public class  RealSubject implements TextInt{
@Override
public void rent() {
System.out.println("I want to tent my house");
}

@Override
public void hello(String str) {
System.out.println("hello:"+str);
}
}





建立 動態代理類
實現動態代理必須實現InvocationHandler這個介面
並且實現 invoke這個方法
public class DynamicProxy implements InvocationHandler {
//要代理的真實物件
private Object RealSubject;
//賦予真實的物件初值
public DynamicProxy(Object subject) {
this.RealSubject = subject;
}

@Override
//代理類的 物件 方法和引數
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在代理物件前我們可以新增一些自己的操作
System.out.println("befor");
System.out.println("Method:"+method);
//當代理物件呼叫真實物件的方法時,回自己跳轉到
//關聯的RealSubject物件的invoke方法來進行呼叫
        Object invoke = method.invoke(RealSubject, args);
// System.out.println("invoker:"+invoke.toString());

//災之後
System.out.println("after");
return null;
}
}
    

//建立模擬客戶端

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
//要代理的真實物件
RealSubject realSubject = new RealSubject();
//蔣旭要代理的真實物件傳進去
DynamicProxy handler = new DynamicProxy(realSubject);
//proxy 代理類三個引數

RealSubject subject =
(RealSubject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);
System.out.println(subject.getClass().getName());
subject.rent();
subject.hello("王紫輝");
}
}
如此 完成動態代理