小弟菜鸟,刚看动态代理,想请教诸位牛人一个问题,就是如何在InvocationHandler中代理多个方法?
比如有个接口叫Test,代码如下
[code="java"]public interface Test
{
void methodA();
void methodB();
void methodC(String a);
}[/code]
现在我有个实现类叫TestImpl,代码如下
[code="java"]
public class TestImpl implements Test
{
public void methodA()
{
Syste.out.println("methodA is invoked");
};
public void methodB()
{
Syste.out.println("methodBis invoked");
};
public void methodC(String s)
{
Syste.out.println("methodC receive parameter "+s);
};
}
[/code]
现在我希望有个TestImplProxy,它的作用是当调用TestImpl类中的MethodsA方法时,能够在[color=red]方法methodA运行前[/color]打印“I will run methodA”,能够在[color=red]方法methodB运行后[/color]打印“I have finished methodB”,能够在[color=red]方法methodC运行前[/color]打印“I will run methodC”和[color=red]运行后[/color]打印“I have finished methodC”
恳请熟悉的朋友能写个实例代码,谢谢您了
Java动态代理的疑问
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答
- wanghaolovezlq 2009-04-14 12:03关注
[code="java"]
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyTest {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Test test = new TestImpl(); InvocationHandler handler = new TestHandler(test); Object proxy = Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), handler); Test proxyAfter = (Test)proxy; proxyAfter.methodA(); proxyAfter.methodB(); proxyAfter.methodC("aa"); }
}
class TestHandler implements InvocationHandler
{
/**
Constructs a TraceHandler
@param t the implicit parameter of the method call
*/
public TestHandler(Object t)
{
target = t;
}public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
{
if(m.getName().equals("methodA"))
{
System.out.println("I will run methodA");
return m.invoke(target, args);
}
else if(m.getName().equals("methodB"))
{
System.out.println("I have finished methodB");
return m.invoke(target, args);
}
else if(m.getName().equals("methodC"))
{
System.out.println("I will run methodC");
Object o = m.invoke(target, args);
System.out.println("I have finished methodC");
return o;
}return m.invoke(target, args);
}
private Object target;
}interface Test
{
void methodA();
void methodB();
void methodC(String a);
}class TestImpl implements Test
{
public void methodA()
{
System.out.println("methodA is invoked");
};
public void methodB()
{
System.out.println("methodBis invoked");
};
public void methodC(String s)
{
System.out.println("methodC receive parameter "+s);
};
}[/code]
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 对于相关问题的求解与代码
- ¥15 ubuntu子系统密码忘记
- ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
- ¥15 保护模式-系统加载-段寄存器
- ¥15 电脑桌面设定一个区域禁止鼠标操作
- ¥15 求NPF226060磁芯的详细资料
- ¥15 使用R语言marginaleffects包进行边际效应图绘制
- ¥20 usb设备兼容性问题
- ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
- ¥15 安装svn网络有问题怎么办