proxy 動態代理 靜態代理
阿新 • • 發佈:2018-12-08
什麼是代理 就是在不改變原來程式碼的前提下 為原來的程式碼增加新的功能
作用解耦
增加可維護性
動態代理和靜態代理的區別
動態代理不用頻繁的建立代理類
減小消耗 提高效能
動態代理代理的類是活的(可變的) 靜態代理是死的(不可變的)
先寫靜態代理 先死後活,死去活來
首先建立介面
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("王紫輝");
}
}
如此 完成動態代理