ant和junit集成处理一个代理的例子是什么?
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)根本不知道存在该行为的