Was ist ein Java-Proxy?
Was ist ein Proxy? Der Zugriff auf das Ziel erfolgt nicht direkt, sondern über eine Zwischenschicht, wie folgt:Statischer Java-Proxy
Wenn beispielsweise einige unserer Früchte, wie Bananen, Äpfel usw., in Java-Code geschrieben sind, sehen sie wahrscheinlich so aus:(Empfohlenes Tutorial: Java-Tutorial )
//Fruit.java/** * 水果的接口 */public interface Fruit { /** * 获取水果的名字 */ public String getName(); }//Apple.javapublic class Apple implements Fruit { @Override public String getName() { return "苹果"; } }//Banana.javapublic class Banana implements Fruit { @Override public String getName() { return "香蕉"; } }
//PeelFruitProxy.java/** * 代理,让每个水果去皮 */public class PeelFruitProxy implements Fruit { private Fruit mFruit; public PeelFruit(Fruit fruit) { this.mFruit = fruit; } @Override public String getName() { System.out.println("proxt:" + proxy.getClass().getName()); return "去皮的" + mFruit.getName(); } }
//Main.javapublic class Main { public static void main(String[] args) { Apple apple=new Apple();//原始的苹果 Banana banana=new Banana();//原始的香蕉 PeelFruitProxy peelApple=new PeelFruitProxy(apple);//代理,添加去皮功能 PeelFruitProxy peelBanana=new PeelFruitProxy(banana);//代理,添加去皮功能 System.out.println(peelApple.getName()); System.out.println(peelBanana.getName()); } }
Dynamischer Proxy von Java
In Java gibt es eine Klasse namens Proxy, die dies erledigt, und Sie können Reflektion und Proxy-Abfangen direkt verwenden. Lassen Sie uns diese Klasse zunächst kurz vorstellen. Tatsächlich ist die am häufigsten verwendete statische Methode Proxt.newProxyInstance(), die so aussieht:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
//FruitInvocationHandler.java/** * 调用方法拦截器 */public class FruitInvocationHandler implements InvocationHandler { private Fruit mFruit; public FruitInvocationHandler(Fruit fruit) { this.mFruit = fruit; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String result = (String) method.invoke(mFruit, args);//需要在这个方法里面,主动调用被代理的对象。 return "去皮的" + result; } }
//Main.Javapublic class Main { public static void main(String[] args) { Apple apple = new Apple(); Fruit proxyApple = (Fruit) Proxy.newProxyInstance(Fruit.class.getClassLoader(), new Class[]{Fruit.class}, new FruitInvocationHandler(apple)); System.out.println(proxyApple.getClass().getName()); System.out.println(proxyApple.getName()); Banana banana = new Banana(); Fruit proxyBanana = (Fruit) Proxy.newProxyInstance(Fruit.class.getClassLoader(), new Class[]{Fruit.class}, new FruitInvocationHandler(banana)); System.out.println(proxyApple.getClass().getName()); System.out.println(proxyBanana.getName()); } }
CGLib-Proxy
cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime.
//FruitMethodInterceptor.java/** * CGLib代理的方法拦截器 */public class FruitMethodInterceptor implements MethodInterceptor{ @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { String result = (String) proxy.invokeSuper(obj, args);//主要,这里调用的是父类,也就是说, 生成的类和原始类是继承关系 return "去皮的"+result; } }//Main.javapublic class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Apple.class); enhancer.setCallback(new FruitMethodInterceptor()); Apple apple = (Apple) enhancer.create(); System.out.println(apple.getClass().getName()); System.out.println(apple.getName()); } }
Zusammenfassung
Der erste Proxy-Typ wird hier nicht erwähnt. Er ist nur für einen einzelnen Schnittstellen-Proxy geeignet und wird zur Kompilierungszeit festgelegt. Die zweite und dritte Art von Proxys sind alle dynamische Proxys, aber wir sehen, dass es Unterschiede gibt: 1) Der dynamische Proxy von JDK kann nur Schnittstellen-Proxys implementieren und ist ein gepacktes Proxy-Objekt (. Das heißt, während des Proxy-Prozesses gibt es zwei Objekte, ein Proxy-Objekt und ein Zielobjekt. Das Zielobjekt wird in das Proxy-Objekt gepackt. 2) Der Proxy von CGLib erbt das Zielobjekt, generiert eine neue Klasse und implementiert dann den Proxy. Auf diese Weise befindet sich ein Proxyobjekt im Speicher und es wird keine direkte Vererbung verwendet Methode generiert Proxy-Klassen zur Laufzeit, was sich von Javapoet unterscheidet, das Klassen zur Kompilierungszeit generiert.Das obige ist der detaillierte Inhalt vonWas ist ein Java-Proxy?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!