文档章节

java代理课程测试 spring AOP代理简单测试

猪刚烈
 猪刚烈
发布于 2014/08/16 09:35
字数 1369
阅读 5
收藏 0

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());
	}

}


本文转载自:http://blog.csdn.net/liangrui1988/article/details/16797057

猪刚烈

猪刚烈

粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
JAVA动态代理 和 Spring AOP 4种通知的简单实现

学习Spring AOP 之前,先要了解下JAVA的动态代理。如果不清楚动态代理的概念就百度一下吧。废话不多说,直接上代码。 我们模拟一个简单的登录 首先我们创建一个用户登录的接口 package com....

poorcoder
2014/04/04
6K
0
Java设计模式综合运用(动态代理+Spring AOP)

AOP设计模式通常运用在日志,校验等业务场景,本文将简单介绍基于Spring的AOP代理模式的运用。 1. 代理模式 1.1 概念 代理(Proxy)是一种提供了对目标对象另外的访问方式,即通过代理对象访问...

landy8530
2018/10/05
0
0
关于在Spring 中方法内部调用自身方法事务 REQUIRE_NEW 不生效的解释

问题来自:Spring事务的传播行为中REQUIRESNEW真的有效吗 这个是Spring 对拦截的实现有关。Spring 拦截实现的方法是动态生成一个代理类。正常使用 @Autowired 注解注入的实际上就是这个代理类...

52iSilence7
04/06
29
0
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),也就是面向方面编程,作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 ...

IBMdW
2012/09/26
1K
2
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架...

只想一个人静一静
2014/02/27
88
0

没有更多内容

加载失败,请刷新页面

加载更多

02.日志系统:一条SQL更新语句是如何执行的?

我们还是从一个表的一条更新语句说起,我们创建下面一张表: create table T(ID int primary key, c int); 如果要将ID=2这一行c的值加1,SQL可以这么写: update T set c=c+1 where ID=2; 前...

scgaopan
今天
7
0
【五分钟系列】掌握vscode调试技巧

调试前端js 准备一个前端项目 index.html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1......

aoping
今天
6
0
PhotoShop 高级应用:USM锐化/S锐化/防抖

、 高反差锐化+混合模式:叠加模式 【将更多的边缘细节添加到图像中】

东方墨天
今天
7
0
Python数据可视化之matplotlib

常用模块导入 import numpy as npimport matplotlibimport matplotlib.mlab as mlabimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom mpl_toolkits.mplot3d i......

松鼠大帝
昨天
5
0
我用Bash编写了一个扫雷游戏

我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习。 我在...

老孟的Linux私房菜
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部