黑马程序员技术交流社区
标题:
动态代理插入通告
[打印本页]
作者:
lwy0319
时间:
2014-4-11 08:00
标题:
动态代理插入通告
看了动态代理,不太清楚怎么将代理需求方法插入到真实方法的前后去:
import java.lang.reflect.*;
interface Person{//建立目标接口
public String say(String name,int age);
}
class Worker implements Person{//建立接口真实实现类
public String say(String name,int age){
return "我叫"+name+","+"我今年"+age+"岁了。";
}
//建立获取其代理类的方法
public static Object getProxy(final Object obj,final Advice advice){
Object proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
advice.beforMethod();
Object temp=method.invoke(obj, args);//传入真实实例对象+参数实例变量组
advice.afterMethod();
//只要让代理类的实例对象调用真实对象的方法就通过此方法
return temp;//返回此方法执行后返回的信息
}
});
return proxy;
}
}
interface Advice{
public void beforMethod();
public void afterMethod();
}
class AdviceInstance implements Advice{
public void beforMethod() {
System.out.println("代理开始");
}
public void afterMethod() {
System.out.println("代理结束");
}
}
public class ProxyTest1 {
public static void main(String[] args) {
Person pr=(Person)Worker.getProxy(new Worker(), new AdviceInstance());
//将目标接口的真实实现类的实例对象传入其中返回一个
System.out.println(pr.say("李文宇",28));
System.out.println(pr.getClass());
}
}
复制代码
我看视频中讲的也是大概这个样子,我想实现的是执行一行我加的命令,再执行一行真实对象方法,再执行一行我的命令。但是由于
在
InvocationHandler接口中
invoke局部最后一行代码是执行返回真实类方法的返回信息。所以无论我之前添加了哪些,它都是最后才执行真实对象的方法,怎么能在后面插入我的命令呢?
作者:
张治国
时间:
2014-4-11 08:32
//这是你的原方法
public static Object getProxy(final Object obj,final Advice advice){
Object proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
advice.beforMethod();
Object temp=method.invoke(obj, args);//传入真实实例对象+参数实例变量组
advice.afterMethod();
//只要让代理类的实例对象调用真实对象的方法就通过此方法
return temp;//返回此方法执行后返回的信息
}
});
return proxy;
}
//按你要求,修改的代码
public static Object getProxy(final Object obj){
Object proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
Object temp=method.invoke(obj, args);//传入真实实例对象+参数实例变量组
//只要让代理类的实例对象调用真实对象的方法就通过此方法
return temp;//返回此方法执行后返回的信息
}
});
return proxy;
}
public static void getResult(final Object obj,final Advice advice){
//代理开始
advice.beforMethod();
getProxy(obj);
//代理结束
advice.afterMethod();
}
作者:
lwy0319
时间:
2014-4-11 09:35
请问getResult在哪里执行呢?而且加在中间的是获取代理类的方法,而不是真实对象执行原方法的语句
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2