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("\n================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("\n================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("\n---------------处理一个OK--------------------");
		coll.add("开始工作3");
		System.out.println("\n---------------处理一个OK--------------------");
		coll.add("开始工作2");
		System.out.println("\n---------------处理一个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("\n---------------处理一个OK--------------------");
		coll.add("开始工作2");
		System.out.println("\n---------------处理一个OK--------------------");
	    System.out.println(coll.size());
	}

}


你可能感兴趣的:(java代理课程测试 spring AOP代理简单测试)