[size=medium][color=blue]由于我刚学JAVA3到4个月,所以JAVA语言的很多知识都理解的不透彻,但是我勉励自己有空多来这里做做学习笔记,同时希望高手指正 总之我个人觉得代理模式思想在Struts2.0中的拦截器和Spring的AOP中都被升华了[/color] 附件中是我QQ截的UML类图
[color=blue]//代理接口[/color]
[color=brown]package[/color] proxy;
[color=brown]public interface [/color][color=darkblue]IMyBussiness[/color] {
[color=brown]public abstract void[/color] add();
[color=brown]public abstract int [/color]delete();
[color=brown]public abstract void [/color]update();
}
[color=green]//代理类[/color]
[color=brown]package[/color] proxy;
[color=brown]public class[/color] [color=green]MyBussiness [/color]implements [color=darkblue]IMyBussiness[/color]
/*
* (non-Javadoc)
*
* @see proxy.IMyBussiness#add()
*/
[color=brown]public void[/color] add() {
[color=blue]//业务处理代码[/color]
System.out.println("[color=blue]业务处理,添加信息[/color]");
}
//[color=blue]这里返回类型int 为测试用[/color]
[color=brown]public int [/color]delete() {
System.out.println("[color=blue]业务处理,删除信息[/color]");
return 1;
}
[color=brown]public void[/color] update() {
System.out.println("[color=blue]业务处理,更新信息[/color]");
}
}
//[color=blue]自定义代理实例的调用处理程序类需实现[/color]java.lang.reflect.InvocationHandler[color=blue]接口[/color]
[color=brown]package[/color] proxy;
[color=brown]import [/color]java.lang.reflect.InvocationHandler;
[color=brown]import [/color]java.lang.reflect.Method;
[color=brown]import[/color] org.apache.log4j.Logger;
[color=brown]public class[/color] [color=green]LogInvocationHandler[/color] [color=brown]implements[/color] [color=darkblue]InvocationHandler [/color]{
[color=green]Logger[/color] log = [color=green]Logger[/color].getLogger(this.getClass());
[color=brown]private[/color] [color=darkblue]IMyBussiness[/color] bussiness;
[color=brown]public[/color] LogInvocationHandler([color=darkblue]IMyBussiness [/color]bussiness) {
[color=brown]this[/color].bussiness = bussiness;
}
[color=brown]public[/color] [color=green] Object [/color]invoke([color=green]Object[/color] proxy, [color=green]Method[/color] method, [color=green]Object[] [/color]args)
[color=brown]throws [/color]Throwable {
String m = method.getName();
if (m != null) {
if (m.startsWith("add")) {
log.info("[color=blue]添加操作[/color]");
} else if (m.startsWith("delete")) {
log.info("[color=blue]删除操作[/color]");
} else if (m.startsWith("update")) {
log.info("[color=blue]更新操作[/color]");
}
}
Object obj = method.invoke(bussiness, args);
[color=blue]// 如果底层方法返回类型为 void,则该调用返回 null[/color] System.out.println("---------" + obj);
[color=brown]return [/color]obj;
}
}
[color=blue]//代理测试类[/color]
[color=brown]package[/color] proxy;
[color=brown]import[/color] java.lang.reflect.Proxy;
[color=brown]public class [/color]Test {
[color=brown]public static void[/color] main([color=green]String[] [/color]args) {
[color=green]MyBussiness[/color] bussiness = new [color=green]MyBussiness[/color]();
[color=green]LogInvocationHandler[/color] handler = [color=brown]new[/color] [color=green]LogInvocationHandler[/color](bussiness);
[color=blue]IMyBussiness[/color] ibussiness = ([color=blue]IMyBussiness[/color]) [color=green]Proxy[/color].newProxyInstance(
bussiness.getClass().getClassLoader(),bussiness.getClass().getInterfaces(), handler);
ibussiness.delete();
}
}
[color=blue]
//输出结果[/color]
[color=indigo]INFO-删除操作
业务处理,删除信息
---------1[/color]
[color=red]//我觉得像我们这样的初学者最好用Debug模式来看下代码的执行流程,另外多看看API文档帮助.[/color][/size]
[color=blue]//代理接口[/color]
[color=brown]package[/color] proxy;
[color=brown]public interface [/color][color=darkblue]IMyBussiness[/color] {
[color=brown]public abstract void[/color] add();
[color=brown]public abstract int [/color]delete();
[color=brown]public abstract void [/color]update();
}
[color=green]//代理类[/color]
[color=brown]package[/color] proxy;
[color=brown]public class[/color] [color=green]MyBussiness [/color]implements [color=darkblue]IMyBussiness[/color]
/*
* (non-Javadoc)
*
* @see proxy.IMyBussiness#add()
*/
[color=brown]public void[/color] add() {
[color=blue]//业务处理代码[/color]
System.out.println("[color=blue]业务处理,添加信息[/color]");
}
//[color=blue]这里返回类型int 为测试用[/color]
[color=brown]public int [/color]delete() {
System.out.println("[color=blue]业务处理,删除信息[/color]");
return 1;
}
[color=brown]public void[/color] update() {
System.out.println("[color=blue]业务处理,更新信息[/color]");
}
}
//[color=blue]自定义代理实例的调用处理程序类需实现[/color]java.lang.reflect.InvocationHandler[color=blue]接口[/color]
[color=brown]package[/color] proxy;
[color=brown]import [/color]java.lang.reflect.InvocationHandler;
[color=brown]import [/color]java.lang.reflect.Method;
[color=brown]import[/color] org.apache.log4j.Logger;
[color=brown]public class[/color] [color=green]LogInvocationHandler[/color] [color=brown]implements[/color] [color=darkblue]InvocationHandler [/color]{
[color=green]Logger[/color] log = [color=green]Logger[/color].getLogger(this.getClass());
[color=brown]private[/color] [color=darkblue]IMyBussiness[/color] bussiness;
[color=brown]public[/color] LogInvocationHandler([color=darkblue]IMyBussiness [/color]bussiness) {
[color=brown]this[/color].bussiness = bussiness;
}
[color=brown]public[/color] [color=green] Object [/color]invoke([color=green]Object[/color] proxy, [color=green]Method[/color] method, [color=green]Object[] [/color]args)
[color=brown]throws [/color]Throwable {
String m = method.getName();
if (m != null) {
if (m.startsWith("add")) {
log.info("[color=blue]添加操作[/color]");
} else if (m.startsWith("delete")) {
log.info("[color=blue]删除操作[/color]");
} else if (m.startsWith("update")) {
log.info("[color=blue]更新操作[/color]");
}
}
Object obj = method.invoke(bussiness, args);
[color=blue]// 如果底层方法返回类型为 void,则该调用返回 null[/color] System.out.println("---------" + obj);
[color=brown]return [/color]obj;
}
}
[color=blue]//代理测试类[/color]
[color=brown]package[/color] proxy;
[color=brown]import[/color] java.lang.reflect.Proxy;
[color=brown]public class [/color]Test {
[color=brown]public static void[/color] main([color=green]String[] [/color]args) {
[color=green]MyBussiness[/color] bussiness = new [color=green]MyBussiness[/color]();
[color=green]LogInvocationHandler[/color] handler = [color=brown]new[/color] [color=green]LogInvocationHandler[/color](bussiness);
[color=blue]IMyBussiness[/color] ibussiness = ([color=blue]IMyBussiness[/color]) [color=green]Proxy[/color].newProxyInstance(
bussiness.getClass().getClassLoader(),bussiness.getClass().getInterfaces(), handler);
ibussiness.delete();
}
}
[color=blue]
//输出结果[/color]
[color=indigo]INFO-删除操作
业务处理,删除信息
---------1[/color]
[color=red]//我觉得像我们这样的初学者最好用Debug模式来看下代码的执行流程,另外多看看API文档帮助.[/color][/size]