日期:2014-05-17  浏览次数:20540 次

java如何监听一个方法被执行
如:
Class A{
 
  private void test(String str) {
System.out.println(str);
}
}


public Class Test{
  public static void main(String[] args) {
  // 在这里如何知道test()被调用了,而且我需要拿到其中的String数据是什么
  // 接着我需要拿str做另外的处理
  }
}

注意Class A属于框架的类。不能修改其中的代码,
哪位达人知道答案,小弟不胜感激!
这是我工作的内容,二天了,没想到答案。希望能得到 大家的帮助,谢谢

------解决方案--------------------
这个需求太奇怪了 test方法还是私有的 又要让人知道 这不违反了封装原则了么
------解决方案--------------------
写一个类继承A,重写test方法
------解决方案--------------------
如果对象A是用Spring配置,通过Spring获取的。你可以使用AOP实现

如果是直接new A()这样的则没有好办法
------解决方案--------------------
用JDK动态代理可以实现
------解决方案--------------------
AOP
------解决方案--------------------
你用代理做完了,把代码发上来我也看看是怎么代的????
------解决方案--------------------
探讨
写一个类继承A,重写test方法

------解决方案--------------------
我也刚学设计模式
呵呵
忒搞笑了
买错书了,买了本c#设计模式的
不过还好他俩差不多
LZ一起学习啊

------解决方案--------------------
AOP

动态代理
------解决方案--------------------
私有方法是在对象内部调用的,无法使用动态代理!
------解决方案--------------------
看一下JDK代理
当然Spring的Aop也是代理
------解决方案--------------------
他那方法是private 继承重写也没用(父类的private方法子类也可以写一样的这样不存在多态), AOP 也不可能截取调。
------解决方案--------------------
string aop可以不????
------解决方案--------------------
了解一下 AspectJ 也不错,它最适合开发过程调用,我在Eclipse 里面为项目添加一个 source folder, 里面写的是 aspect 定义,然后把项目标记为支持 AspectJ, 编译一下就行了,只要我们的代码用到了框架类,它就有机会被我的 Aspect 处理。不管你的方法是静态还是私有,只要你能编译,它就能处理,因为它可以直接在编译完之后修改你的字节码,把我们写的 advice 代码插入到 .class 文件中。

AspectJ 开发是我只在代码编译时编织使用,听说在类加载时都可以自动做到,那就更好了。像 JDK 6 出来之后,EJB3 的应用服务器也用 Instrument 功能把 AOP 应用到了,类加载时做 instrument,也就是在 Class Loader 加载一个类时顺便把它修改之后再 defineClass,执行时我们的代码就被它和谐了。