ant和junit集成处理一个代理的例子

来源:互联网 发布:淘宝如何拍下商品 编辑:程序博客网 时间:2024/05/01 14:04

       学习了几天的代理了,思路是有了,可是到用是还是有点含糊,不知道要什么时候要用方便,老师说

照着“猫”几个例子,以后就会熟悉的,今天就用学过的ant和junit的集成来“猫”了一个简单的代理的例子。

下面是build.xml文件

<?xml version="1.0" encoding="GB2312" ?>
<!--有中文注释时,一定要把encoding的值设置为"GB2312",不然会出错-->
<project name = "junit" default = "report">
 <!--定义属性-->
 <property name="src.java.dir" value="src/java" />
 <property name="src.test.dir" value="src/test" />
 <property name="classes.java.dir" value="classes/java" />
 <property name="classes.test.dir" value="classes/test" />
 <property name="report.dir" value="report" />
 <property name="junit.tooljar.dir" value="C:/JAVA/Junit/junit3.8.1/junit.jar" />
 <!--定义初始化任务,生成文件目录-->
 <target name="init">
  <mkdir dir="${classes.java.dir}" />
  <mkdir dir="${classes.test.dir}" />
  <mkdir dir="${report.dir}" />
 </target>
 
 <!--定义编译.java文件任务,依赖"init"任务-->
 <target name="compileJava" depends="init">
  <javac srcdir="${src.java.dir}/cn/itcast" destdir="${classes.java.dir}"/>
 </target>
 
 <!--定义编译测试文件,注意把tool.jar包加到classpath中,依赖"init"任务-->
 <target name="compileTest" depends="init">
  <javac srcdir="${src.test.dir}/cn/itcast" destdir="${classes.test.dir}">
   <classpath>
    <pathelement location="${classes.java.dir}" />
    <pathelement location="${junit.tooljar.dir}" />
   </classpath>
  </javac>
 </target>
 
 <target name="compile" depends="compileJava,compileTest" />
 <!--测试程序任务-->
 <target name="test" depends="compile">
  <junit>
   <test name = "cn.itcast.ClientTest" todir = "${report.dir}" /><!--测试文件名-->
   <formatter type = "brief" usefile = "false" /><!--输出格式-->
   <formatter type = "xml" />
   <classpath>
    <pathelement location="${junit.tooljar.dir}" />
    <pathelement location="${classes.test.dir}" />
    <pathelement location="${classes.java.dir}" />
   </classpath>
  </junit>
 </target>
   <!--编写报告文件任务-->
 <target name = "report" depends = "test">
   <junitreport todir="${report.dir}">
    <fileset dir="${report.dir}">
      <include name="**/*Test*.java"/>
    </fileset>
    <report format="frames" todir="${report.dir}/html" />
   </junitreport>
 </target>
 
</project> 

下面是实现的代理程序

一、接口的实现方案:
1)首先编写我们的业务接口(StudentInfoService.java):
public interface StudentInfoService{
 void findInfo(String studentName);
}
     及其实现类(StudentInfoServiceImpl.java):
public class StudentInfoServiceImpl implements StudentInfoService{
 public void findInfo(String name){
  System.out.println("你目前输入的名字是:"+name);
 }
}
2)现在我们需要一个日志功能,在findInfo行为之前执行并记录其行为,那么我们就首先要拦截该行为。在实际执行的过程中用一个代理类来替我们完成。Java中为我们提供了实现动态代理类的方案:

1'处理拦截目的的类(MyHandler.java)
import org.apache.log4j.Logger;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;

public class MyHandler implements InvocationHandler{
 private Object proxyObj;
 private static Logger log=Logger.getLogger(MyHandler.class);
 
 public Object bind(Object obj){
  this.proxyObj=obj;
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
 }
 
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  Object result=null;
  try{
   //请在这里插入代码,在方法前调用
   log.info("调用log日志方法"+method.getName());
   result=method.invoke(proxyObj,args); //原方法
   //请在这里插入代码,方法后调用
  }catch(Exception e){
   e.printStackTrace();
  }
  return result;
 }
}
2'我们实现一个工厂,为了方便我们使用该拦截类(AOPFactory.java):
public class AOPFactory{
 private static Object getClassInstance(String clzName){
  Object obj=null;
  try{
   Class cls=Class.forName(clzName);
   obj=(Object)cls.newInstance();
  }catch(ClassNotFoundException cnfe){
   System.out.println("ClassNotFoundException:"+cnfe.getMessage());
  }catch(Exception e){
   e.printStackTrace();
  }
  return obj;
 }
 
 public static Object getAOPProxyedObject(String clzName){
  Object proxy=null;
  MyHandler handler=new MyHandler();
  Object obj=getClassInstance(clzName);
  if(obj!=null) {
   proxy=handler.bind(obj);
  }else{
   System.out.println("Can't get the proxyobj");
   //throw
  }
  return proxy;
 }
}

3)基本的拦截与其工厂我们都实现了,现在测试(ClientTest.java):
public class ClientTest{
 public static void main(String[] args){
  StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");
  studentInfo.findInfo("阿飞");
 }
}
输出结果(看你的log4j设置):
[INFO]调用log日志方法findInfo
你目前输入的名字是:阿飞
     这样我们需要的效果就出来了,业务处理自己在进行,但是我们实现了日志功能,而业务处理(StudentInfoService)根本不知道存在该行为的

 

原创粉丝点击