ant和junit集成处理一个代理的例子是什么?
学习了几天的代理了,思路是有了,可是到用是还是有点含糊,不知道要什么时候要用方便,老师说
照着“猫”几个例子,以后就会熟悉的,今天就用学过的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)根本不知道存在该行为的