zoukankan      html  css  js  c++  java
  • java代理课程测试 spring AOP代理简单测试

    jjava加强课程测试代码 反射、 代理 、泛型、beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169

    热身运动代码。。。。。。。。。

    package com.proxyTest;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.sql.Connection;
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class ProxyTest {
    	
    	public static void main(String[] args) throws Exception{
    		
    		//获取代理字节码
    		Class clazzProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class);
    		
    		System.out.println(clazzProxy.getName());
    		System.out.println("-----------Proxy构造方法列表------------");
    		Constructor[] constructor=clazzProxy.getConstructors();
    		
    		for(Constructor con:constructor){
    			//get名称
    			String conName=con.getName();
    			
    			//接接参数
    			StringBuilder sb=new StringBuilder(conName);//单线程 快 
    			sb.append('(');
    			//get 获得参数类型的字节码
    			Class[] paraClass=con.getParameterTypes();
    			for(Class c:paraClass){
    				//获取参数
    java加强课程测试代码 反射、 代理 、泛型、beanUtils等				sb.append(c.getName()).append(',');
    			}
    			
    			if(paraClass!=null&¶Class.length!=0)
    			sb.deleteCharAt(sb.length()-1);
    			
    			sb.append(')');
    			
    			System.out.println(sb.toString());
    		}
    		
    		
    System.out.println("
    ================Proxy方法列表=============================");
    				
    		Method[] methods=clazzProxy.getMethods();
    		
    		for(Method me:methods){
    			//get名称
    		String conName=me.getName();
    		
    		//接接参数
    		StringBuilder sb=new StringBuilder(conName);//单线程 快 
    		sb.append('(');
    		//get 获得参数类型的字节码
    		Class[] paraClass=me.getParameterTypes();
    		for(Class c:paraClass){
    			//获取参数
    			sb.append(c.getName()).append(',');
    		}
    		
    		if(paraClass!=null&¶Class.length!=0)
    		sb.deleteCharAt(sb.length()-1);
    		
    		sb.append(')');
    			
    			System.out.println(sb.toString());
    		}
    
    		
    		
    		
    		
    System.out.println("
    ================Proxy创建实例=============================");
           //获取指定的构造方法
          Constructor conIns=clazzProxy.getConstructor(InvocationHandler.class);
          
          //创建一个connection类做参数
          class myConn1 implements InvocationHandler{
    
    		@Override
    		public Object invoke(Object proxy, Method method, Object[] args)
    				throws Throwable {
    			// TODO Auto-generated method stub
    			return null;
    		}
        	  
          }
          
          //创建实例
         Collection proxy1 =(Collection) conIns.newInstance(new myConn1());
          System.out.println(proxy1);
          
         // proxy1.size();
        
           //创建实例 方式2===================================
         @SuppressWarnings("unchecked")
    	Collection<String> proxy2 =(Collection<String>) conIns.newInstance(new InvocationHandler(){
        	  //内部类 
    		@Override
    		public Object invoke(Object proxy, Method method, Object[] args)
    				throws Throwable {
    			return null;
    		}
          } );
          
          
          //创建实例  方式3===================================
         Collection proxy3=(Collection) Proxy.newProxyInstance(
        		 //类加载器 
        		 Collection.class.getClassLoader(),
        		 // 参数数内型
        		 new Class[]{Collection.class},
        		 //参数值 
        		 new InvocationHandler(){
        			 /**
        			  * proxy 代理的对象
        			  * method 代理对象的那个方法
        			  * args 方法中传入的参数
        			  */
        			 ArrayList target=new ArrayList();
    				@Override
    				public Object invoke(Object proxy, Method method, Object[] args)
    						throws Throwable {
    			       Long startTime=	System.currentTimeMillis();
    					//方法调用 参数 目标对象和参数
    					Object obj=method.invoke(target, args);
    				    Long endTime=	System.currentTimeMillis();
    				  System.out.println(method.getName()+"runTime of 用时:"+(endTime=startTime));  
    				  
    				  //死循环
    				//  return  method.invoke(proxy,args);
    				  
    				  //返回对象
    				  return obj;
    				}}
        		  );
          
         proxy3.add("aaaa");
         proxy3.add("bbbb"); 
         proxy3.add("ccccc");
       // System.out.println(proxy3.size());
         
    	}
    	
    	
    	
    	
    	
    	
    	
    	
    	
    
    }
    


    进一步加强代码

    package com.proxyTest;
    
    import java.lang.reflect.Method;
    /**
     * 通知接口
     * @author liangrui
     *
     */
    public interface Advice {
    
    	public void beforeMethod(Method m);//开始方法
    	public void afterMethod(Method m);//结束方法
    	//异常方法,前后方法 省略
    	
    }
    
    package com.proxyTest;
    
    import java.lang.reflect.Method;
    /**
     * 实现自已的处理功能对象
     * @author liangrui
     *
     */
    public class Myadvice implements Advice {
    	  Long startTime=null;
    	@Override
    	public void beforeMethod(Method m) {
    		System.out.println("欢迎来到代理处理对象 开始方法");
    		  startTime=	System.currentTimeMillis();
    
    	}
    
    	@Override
    	public void afterMethod(Method m) {
    		System.out.println("欢迎来到代理处理对象  执行之后处理的方法");
    		 Long endTime=	System.currentTimeMillis();
    		System.out.println(m.getName()+"runTime of 用时:"+(endTime=startTime));  
    	}
    
    }
    
    package com.proxyTest;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class ProxyTests {
    	
    	public static void main(String[] args) {
    		
    		ArrayList target=new ArrayList();//代理目标对象
    		//获取代理 对象
    		Collection coll=(Collection) getProxy(target,new Myadvice());
    		
    		/**
    		 * 每次在执行自已方法的同时
    		 * 都会执行自定义对象(MyAdivce)功能来进行处理
    		 */
    		
    		coll.add("开始工作");
    		System.out.println("
    ---------------处理一个OK--------------------");
    		coll.add("开始工作3");
    		System.out.println("
    ---------------处理一个OK--------------------");
    		coll.add("开始工作2");
    		System.out.println("
    ---------------处理一个OK--------------------");
    	System.out.println(coll.size());
    	
    	}
    	
    	/**
    	 * 代理处理方法 返回处理后的对象
    	 * @param target 目标对象
    	 * @param advice 通告
    	 * @return
    	 */
    	public static Object getProxy(final Object target,final Advice advice){
    		Object proxyObj=Proxy.newProxyInstance(
    				target.getClass().getClassLoader()//类加载器
    				, target.getClass().getInterfaces()//参数类型
    				,new InvocationHandler() {//调用方法进行处理
    					@Override
    					public Object invoke(Object proxy, Method method, Object[] args)
    							throws Throwable {
    					
    						//代理功能处理 把方法交给它进行处理
    						advice.beforeMethod(method);
    						//处理自已的方法
    						Object returnObj=method.invoke(target, args);
    						advice.afterMethod(method);
    						//返回处理后的对象
    						return returnObj;
    					}
    				});
    		
    		return proxyObj;
    	}
    
    }
    


    //spring AOP 简单的实现例子


    package com.AopFramework;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    import com.proxyTest.Advice;
    
    public class FactoryBean {
    	
    	Properties pro=new Properties();
    	
    	
    	public FactoryBean(InputStream is){
    		try {
    			pro.load(is);//加载数据流得到配制信息
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	//通过Key获取对象
    	public Object getBean(String name){
    		//通过Key获取类路径
    		String classPath=pro.getProperty(name);
    		Object bean=null;
    		try {
    			//获取类的字节码
    			Class clazz=Class.forName(classPath);
    			//得到对象实例
    			bean=clazz.newInstance();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		//如果是代理对象则返回代理对象
    		if(bean instanceof ProxyFactoryBean){
    		//强转为代理对象
    		ProxyFactoryBean proxyFactoryBean=(ProxyFactoryBean)bean;
    		
    		Object ProxyBean = null;
    		try {
    			//获取功能对象
    			Advice advice=(Advice) Class.forName(pro.getProperty(name+".advice")).newInstance();
    			//目标对象
    			Object target=         Class.forName(pro.getProperty(name+".target")).newInstance();
    			proxyFactoryBean.setAdvice(advice);//为代理对象加入 功能对象
    			proxyFactoryBean.setTarget(target);//加入目标对象
    			//get代理对象
    			ProxyBean = proxyFactoryBean.getProxy();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    		//返回代理对象
    		return ProxyBean;
    		}
    		
    		//返回没有代理过的对象
    		return bean;
    		
    	}
    }
    
    package com.AopFramework;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.Properties;
    
    import com.proxyTest.Advice;
    
    public class ProxyFactoryBean {
    
    	private Advice advice;//代理通告对象
    	private Object target;//代理目标对象
    	
    	
    	/**
    	 * 代理处理方法 返回处理后的对象
    	 * @param target 目标对象
    	 * @param advice 通告
    	 * @return
    	 */
    	public Object getProxy() {
    		Object proxyObj=Proxy.newProxyInstance(
    				target.getClass().getClassLoader()//类加载器
    				, target.getClass().getInterfaces()//参数类型
    				,new InvocationHandler() {//调用方法进行处理
    					@Override
    					public Object invoke(Object proxy, Method method, Object[] args)
    							throws Throwable {
    					
    						//代理功能处理 把方法交给它进行处理
    						advice.beforeMethod(method);
    						//处理自已的方法
    						Object returnObj=method.invoke(target, args);
    						advice.afterMethod(method);
    						//返回处理后的对象
    						return returnObj;
    					}
    				});
    		
    		return proxyObj;
    	}
    	
    	
    	//=======================================
    	public Advice getAdvice() {
    		return advice;
    	}
    	public void setAdvice(Advice advice) {
    		this.advice = advice;
    	}
    
    	public Object getTarget() {
    		return target;
    	}
    	public void setTarget(Object target) {
    		this.target = target;
    	}
    
    
    
    }
    


    config.properties 配置文件

    #target
    #xxx=java.util.ArrayList
    #proxy
    xxx=com.AopFramework.ProxyFactoryBean
    
    #target object
    xxx.target=java.util.ArrayList
    #advice object
    xxx.advice=com.proxyTest.Myadvice
    
    package com.AopFramework;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Collection;
    
    import com.proxyTest.Myadvice;
    
    public class AopFrameworkTest {
    	public static void main(String[] args) {
    		//加载配制文件
    		InputStream is=AopFrameworkTest.class.getResourceAsStream("config.properties");
    	
    		//创建工厂实例 ---》获得bean
    		Object obj=new FactoryBean(is).getBean("xxx");
    		//根据你入的名称和配制       打印获得的对象名称
    		System.out.println(obj.getClass().getName());
    	
    	
    		//打印测试
    		Collection coll=(Collection) obj;
    		
    		/**
    		 * 每次在执行自已方法的同时
    		 * 都会执行自定义对象(MyAdivce)功能来进行处理
    		 */
    		
    		coll.add("开始工作");
    		System.out.println("
    ---------------处理一个OK--------------------");
    		coll.add("开始工作2");
    		System.out.println("
    ---------------处理一个OK--------------------");
    	    System.out.println(coll.size());
    	}
    
    }
    


  • 相关阅读:
    C++指针(一)
    探讨mvc下linq多表查询使用viewModel的问题
    利用aspnetPager控件加存储过程实现对gridview的分页
    Javascript 笔记
    对于最近学习WCF的总结——唔聊的服务
    今天面试的一些知识性总结
    使用C#反序列化plist文件
    Running x86 apps on WinRT devices
    ItemsSource绑定中遇到的问题
    字节对齐 详解
  • 原文地址:https://www.cnblogs.com/riasky/p/3429004.html
Copyright © 2011-2022 走看看