See More

--------------------------- »ñÈ¡¶¯Ì¬´úÀí¶ÔÏó | --------------------------- Object obj = Proxy.newProxyInstance(ClassLoader loader, Class>[] interfaces, InvocationHandler h) 1,classLoader ÐèÒª¶¯Ì¬Éú³ÉÒ»¸öÀà,Õâ¸öÀàÒ²ÐèÒª¼ÓÔØµ½·½·¨ÇøÖÐ,Ë­À´¼ÓÔØ?¾ÍÊÇclassLoader 2,interfaces Æäʵ¾ÍÊÇClassÊý×é,ҪʵÏֵĽӿÚÃÇ 3,Invocationhandler µ÷Óô¦ÀíÆ÷.. # Class ¶ÔÏóµÄ getInterfaces(); ¿ÉÒÔ»ñÈ¡µ½ÀàËùÓÐʵÏÖµÄ½Ó¿Ú --------------------------- InvocationHandler | --------------------------- # ½Ó¿Ú # Ψһ³éÏó·½·¨ Object invoke(Object proxy, Method method, Object[] args) # proxy, µ±Ç°Ö´ÐеĶÔÏó # method, ΪִÐеķ½·¨ # args, ΪִÐз½·¨²ÎÊý --------------------------- Demo 1 | --------------------------- import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //²âÊÔ½Ó¿ÚA interface A{ public void a(); public void aa(); public Object aaa(String s1,int i); } //²âÊÔ½Ó¿ÚB interface B{ public void b(); public void bb(); } //²âÊÔÖ÷·½·¨ public class Demo { public static void main(String[] args){ /** * 1,classLoader * Èý´ó²ÎÊý,Õâ¸ö·½·¨ÐèÒªÈý¸ö²ÎÊý¶¯Ì¬Éú³ÉÒ»¸öÀà,Õâ¸öÀàʵÏÖÁËA,B½Ó¿Ú,È»ºó´´½¨Õâ¸öÀàµÄ¶ÔÏó * ÐèÒªÉú³ÉÒ»¸öÀà,Õâ¸öÀàÒ²ÐèÒª¼ÓÔØµ½·½·¨ÇøÖÐ,Ë­À´¼ÓÔØ?¾ÍÊÇclassLoader * 2,interfaces * Æäʵ¾ÍÊÇClassÊý×é,ҪʵÏֵĽӿÚÃÇ * 3,Invocationhandler * µ÷Óô¦ÀíÆ÷.. * */ InvocationHandler h = new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { return "xxx"; } }; //ʹÓÃÈý´ó²ÎÊý´´½¨´úÀí¶ÔÏó Object obj = Proxy.newProxyInstance(Demo1.class.getClassLoader(), new Class[]{A.class,B.class}, h); A a = (A)obj; //ǿת³É¹¦,ºÜÏÔÈ»ÊÇÒѾ­ÊµÏÖÁËA½Ó¿Ú Object o = a.aaa("hello",100); //Æäʵ¾ÍÊǵ÷ÁËinvoke·½·¨ System.out.println(o); //o.¾ÍÊÇ·µ»Øxxx B b = (B)obj; //ǿת³É¹¦,ºÜÏÔÈ»ÊÇÒѾ­ÊµÏÖÁËB½Ó¿Ú } } --------------------------- Demo 2 | --------------------------- import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyFactory { private Object targetObject; //Ä¿±ê¶ÔÏó /** * Éú³É´úÀí¶ÔÏó,×îÎªÖØÒªµÄÒ»¸ö·½·¨ * Ò²ÊÇ×îΪ¸´ÔÓµÄÒ»¸ö·½·¨ * ¶¯£¡Ì¬£¡´ú£¡Àí */ public Object createProxy(){ //»ñÈ¡Àà¼ÓÔØÆ÷ ClassLoader loader = this.getClass().getClassLoader(); //»ñȡĿ±ê¶ÔÏóËùʵÏÖµÄËùÓнӿÚ(×¢Òâ°¡) Class[] interfaces = targetObject.getClass().getInterfaces(); //InvocationHandler InvocationHandler h = new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { try{ //ÔÚÖ´ÐÐ֮ǰ¿ÉÒÔ×öһЩ²Ù×÷ Object result = method.invoke(targetObject, args); //µ÷ÓÃÄ¿±ê¶ÔÏóµÄÄ¿±ê·½·¨ //ÔÚÖ´ÐÐÖ®ºó¿ÉÒÔ×öһЩ²Ù×÷ return result; //·µ»ØÄ¿±ê¶ÔÏó·½·¨Ö´ÐеĽá¹û }catch(Exception e){ //ÔÚÒì³£µÄʱºò¿ÉÒÔ×öһЩ²Ù×÷ return null; } } }; //µÃµ½´úÀí¶ÔÏó Object obj = Proxy.newProxyInstance(loader, interfaces, h); //·µÖ® return obj; } //»ñÈ¡ÔöÇ¿¶ÔÏó public Object getTargetObject() { return targetObject; } //ÉèÖÃÔöÇ¿¶ÔÏó public void setTargetObject(Object targetObject) { this.targetObject = targetObject; } }