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

来源:互联网 发布:java多线程框架有哪些 编辑:程序博客网 时间:2024/06/04 18:06

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{@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubreturn 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(){      //内部类 @Overridepublic 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();@Overridepublic 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;@Overridepublic void beforeMethod(Method m) {System.out.println("欢迎来到代理处理对象 开始方法");  startTime=System.currentTimeMillis();}@Overridepublic 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() {//调用方法进行处理@Overridepublic 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 blocke.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() {//调用方法进行处理@Overridepublic 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#proxyxxx=com.AopFramework.ProxyFactoryBean#target objectxxx.target=java.util.ArrayList#advice objectxxx.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");//创建工厂实例 ---》获得beanObject 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());}}


原创粉丝点击