Proxy

getProxyClass(ClassLoader loader, Class<?>... interfaces) 


创建动态类及查看其方法列表信息

ProxyTest.java

public class ProxyTest {
     public static void main(String[] args) {
         //这是一个字节码
         Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
 //        System.out.println(clazzProxy1.getName());
         
         System.out.println("begin construtcor list ================================================ ");
         Constructor[] constructors = clazzProxy1.getConstructors();
         for (Constructor constructor : constructors) {
             String conName = constructor.getName();
             StringBuilder stringBuilder = new StringBuilder(conName);
             stringBuilder.append("(");
             Class[] clazzParams = constructor.getParameterTypes();
             for (Class clazzParam : clazzParams) {
                 stringBuilder.append(clazzParam.getName()).append('|');
             }
             if (clazzParams != null && clazzParams.length != 0) {
                 stringBuilder.deleteCharAt(stringBuilder.length()-1);
             }
             stringBuilder.append(")");
             System.out.println(stringBuilder.toString());
         }
         
         System.out.println("end construtcor list ================================================ ");
 //        System.out.println(clazzProxy1.getName());


        
        System.out.println("begin methods list ================================================ ");
  

Method[] methods = clazzProxy1.getMethods();
         for (Method method : methods) {
             String conName = method.getName();
             StringBuilder stringBuilder = new StringBuilder(conName);
             stringBuilder.append("(");
             Class[] clazzParams = method.getParameterTypes();
             for (Class clazzParam : clazzParams) {
                 stringBuilder.append(clazzParam.getName()).append('|');
             }
             if (clazzParams != null && clazzParams.length != 0) {
                 stringBuilder.deleteCharAt(stringBuilder.length()-1);
             }
             stringBuilder.append(")");
             System.out.println(stringBuilder.toString());
         }
         
         System.out.println("end methods list ================================================ ");
         
     }
 }


创建动态类的实例对象及调用其方法


System.out.println("begin create instanse list ================================================ ");


        


        Collection proxy1 = (Collection)constructor.newInstance(new myInvocationHandler1());

Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class); 

         class myInvocationHandler1 implements InvocationHandler { 

             @Override 

             public Object invoke(Object proxy, Method method, Object[] args) 

                     throws Throwable { 

                 // TODO Auto-generated method stub 

                 return null; 

             } 

         };


        


        Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){


            @Override


            public Object invoke(Object proxy, Method method, Object[] args)


                    throws Throwable {


                // TODO Auto-gener

ated method stub 

                 return null; 

             } 

         });


        


        Collection proxy3 = (Collection)Proxy.newProxyInstance(


                Collection.class.getClassLoader(),


                new Class[]{Collection.class},


                new InvocationHandler() {


                    ArrayList target = new ArrayList();


                    @Override

public Object invoke(Object proxy, Method method, Object[] args) 

                             throws Throwable { 

 //                        ArrayList target = new ArrayList(); 

                         long beginTime = System.currentTimeMillis(); 

                         Object retVal = method.invoke(target, args); 

                         long endTime = System.currentTimeMillis(); 

                         System.out.println(method.getName() + " running time ==  " + (endTime-beginTime)); 

                         return retVal; 

                     } 

         });



    

proxy3.add("ddd"); 

         proxy3.add("aaa"); 

         proxy3.add("vvv"); 

          

         System.out.println(proxy1.toString()); 

         System.out.println(proxy2.toString()); 

         System.out.println(proxy3.toString()); 

         System.out.println(proxy3.size());


        System.out.println("end create instanse list ================================================ ");





规范的动态生成代理 相当于一个小框架aop

Advice.java

public interface Advice {
    void beforeMethod(Method method);
    void afterMethod(Method method);
}

MyAdvice.java

public class MyAdvice implements Advice {
     long beginTime = 0;
     public void afterMethod(Method method) {
         // TODO Auto-generated method stub
         System.out.println("毕业上班啦!");        
         long endTime = System.currentTimeMillis();
         System.out.println(method.getName() + " running time of " + (endTime - beginTime));

     }

     public void beforeMethod(Method method) {
         // TODO Auto-generated method stub
         System.out.println("来学习啦!");
         beginTime = System.currentTimeMillis();
     }
 }

ProxyTest .java

public class ProxyTest {

     /**
      * @param args
      */
     public static void main(String[] args) throws Exception{
         // TODO Auto-generated method stub
         Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
         System.out.println(clazzProxy1.getName());
         
         System.out.println("----------begin constructors list----------");
         /*$Proxy0()
         $Proxy0(InvocationHandler,int)*/
         Constructor[] constructors = clazzProxy1.getConstructors();
         for(Constructor constructor : constructors){
             String name = constructor.getName();
             StringBuilder sBuilder = new StringBuilder(name);
             sBuilder.append('(');
             Class[] clazzParams = constructor.getParameterTypes();
             for(Class clazzParam : clazzParams){
                 sBuilder.append(clazzParam.getName()).append(',');
             }
             if(clazzParams!=null && clazzParams.length != 0)
                 sBuilder.deleteCharAt(sBuilder.length()-1);
             sBuilder.append(')');
             System.out.println(sBuilder.toString());            
         }



        System.out.println("----------begin methods list----------");
     

/*$Proxy0()
         $Proxy0(InvocationHandler,int)*/
         Method[] methods = clazzProxy1.getMethods();
         for(Method method : methods){
             String name = method.getName();
             StringBuilder sBuilder = new StringBuilder(name);
             sBuilder.append('(');
             Class[] clazzParams = method.getParameterTypes();
             for(Class clazzParam : clazzParams){
                 sBuilder.append(clazzParam.getName()).append(',');
             }
             if(clazzParams!=null && clazzParams.length != 0)
                 sBuilder.deleteCharAt(sBuilder.length()-1);
             sBuilder.append(')');
             System.out.println(sBuilder.toString());            
         }
         
         System.out.println("----------begin create instance object----------");
         //Object obj = clazzProxy1.newInstance();
         Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
         class MyInvocationHander1 implements InvocationHandler{

             public Object invoke(Object proxy, Method method, Object[] args)
                     throws Throwable {
                 // TODO Auto-generated method stub
                 return null;
             }
         
         }


        Collection proxy1 = (Collection)constructor.newInstance(new MyInvocationHander1());
        
     

System.out.println(proxy1);
         proxy1.clear();
         //proxy1.size();
         //System.out.println("111111111111111");
         
         Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){

             public Object invoke(Object proxy, Method method, Object[] args)
                     throws Throwable {
                 return null;
             }
             
         });
         
         final ArrayList target = new ArrayList();            
         Collection proxy3 = (Collection)getProxy(target,new MyAdvice());
         proxy3.add("zxx");
         proxy3.add("lhm");
         proxy3.add("bxd");
         System.out.println(proxy3.size());
         System.out.println(proxy3.getClass().getName());
     }



private static Object getProxy(final Object target,final Advice advice) {
         Object proxy3 = Proxy.newProxyInstance(
                 target.getClass().getClassLoader(),
                 /*new Class[]{Collection.class},*/
                 target.getClass().getInterfaces(),
                 new InvocationHandler(){
                 
                     public Object invoke(Object proxy, Method method, Object[] args)
                             throws Throwable {

                         /*long beginTime = System.currentTimeMillis();
                         Object retVal = method.invoke(target, args);
                         long endTime = System.currentTimeMillis();
                         System.out.println(method.getName() + " running time of " + (endTime - beginTime));
                         return retVal;*/
                         

                         advice.beforeMethod(method);
                         Object retVal = method.invoke(target, args);
                         advice.afterMethod(method);
                         return retVal;                        
                         
                     }
                 }
                 );
         return proxy3;
     }

 }