我们可以改变一个函数的实现吗?

时间:2015-05-29 05:47:52

标签: java reflection

有一个框架,包含4个函数,如:

public long t1(){
    return 10;
}

public long t2(){
    return 20;
}

public long t3() {
    return 30;
}

public long t4(){
    return (t2()-t1());
}

我们可以将t4的实现改为:

 public long t4(){
        return (t3() - t1());
    }

add:我们无法改变现有框架的实现。

add2:这个框架的类没有被用户直接使用,所以我无法扩展它,并覆盖该方法。

2 个答案:

答案 0 :(得分:1)

只使用面向对象的Java或反射,你永远无法完全满足你的要求。

实际上,更改方法实现正在改变类的静态部分。这在课堂加载后无法实现。

但是如何在加载类之前更改静态部分?答案是:方面取向。然后,您可以在源时,编译时或类加载时更改类的静态部分。

由于您没有源代码,我认为您使用的是预编译库。所以你必须在课堂加载时这样做。这是由加载时间编织器完成的,例如使用AspectJ。

我建议添加环绕建议来短路当前方法并执行所需的语句。

总结:使用AspectJ和该方法的环绕建议。

答案 1 :(得分:0)

我们可以使用method-overriding的概念覆盖现有方法。

 class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move();// runs the method in Animal class

      b.move();//Runs the method in Dog class
   }
}