import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @program JavaBooks * @description: ä»£çæ¨¡å¼ * @author: mf * @create: 2019/10/02 10:04 */ /* æè°ä»£çæ¨¡å¼æ¯æå®¢æ·ç«¯å¹¶ä¸ç´æ¥è°ç¨å®é ç对象ï¼èæ¯éè¿è°ç¨ä»£çï¼æ¥é´æ¥çè°ç¨å®é ç对象ã ä¸è¬æ¯å 为客æ·ç«¯ä¸æ³ç´æ¥è®¿é®å®é çå¯¹è±¡ï¼æè 访é®å®é ç对象åå¨å°é¾ï¼å æ¤éè¿ä¸ä¸ªä»£ç对象æ¥å®æé´æ¥ç访é®ã */ /* éæä»£ç */ // ä¸»é¢ interface Subject { void visit(); } // å®ç°subjectç两个类 class RealSubject implements Subject { private String name = "feng zi"; @Override public void visit() { System.out.println(name); } } class ProxySubject implements Subject { private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void visit() { subject.visit(); } } /* 代çç±»æ¥åä¸ä¸ªSubjectæ¥å£ç对象ï¼ä»»ä½å®ç°è¯¥æ¥å£ç对象ï¼é½å¯ä»¥éè¿ä»£çç±»è¿è¡ä»£çï¼å¢å äºéç¨æ§ã æ¯ä¸ä¸ªä»£çç±»é½å¿ é¡»å®ç°ä¸éå§æç±»ï¼ä¹å°±æ¯realsubjectï¼çæ¥å£ï¼å¦ææ¥å£å¢å æ¹æ³ï¼å代çç±»ä¹å¿ é¡»è·çä¿®æ¹ã 代çç±»æ¯ä¸ä¸ªæ¥å£å¯¹è±¡å¯¹åºä¸ä¸ªå§æå¯¹è±¡ï¼å¦æå§æå¯¹è±¡é常å¤ï¼åéæä»£ç类就é常èè¿ï¼é¾ä»¥èä»»ã */ /* 卿代ç å¨æä»£çæ¯å®ç°æ¹å¼ï¼æ¯éè¿åå°æ¥å®ç°çï¼åå©Javaèªå¸¦çjava.lang.reflect.Proxy,éè¿åºå®çè§åçæã */ class DynamicProxy implements InvocationHandler { private Object object; public DynamicProxy(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(object, args); return result; } } public class ProxyMode { public static void main(String[] args) { // éæä»£ç ProxySubject proxySubject = new ProxySubject(new RealSubject()); proxySubject.visit(); // 卿代ç RealSubject realSubject = new RealSubject(); DynamicProxy dynamicProxy = new DynamicProxy(realSubject); ClassLoader classLoader = realSubject.getClass().getClassLoader(); Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, dynamicProxy); subject.visit(); } }