2015-05-29 69 views
0

有一个框架,包含了像4个功能:我们可以改变一个函数的实现吗?

public long t1(){ 
    return 10; 
} 

public long t2(){ 
    return 20; 
} 

public long t3() { 
    return 30; 
} 

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

我们可以改变T4的implementaion到:

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

地址:我们不能改变现有架构的FPGA实现。

add2:框架的这个类不是由用户直接使用,所以我不能扩展它,并覆盖该方法。

+1

为什么不创建自己的方法返回't3() - t1()' –

+0

尝试方法覆盖?扩展类并重写只是方法t4()? – Gosu

+0

在语言:没有。通过字节码操作:是(取决于)。一个这样的库允许这样的[Javassist](http://jboss-javassist.github.io/javassist/)。但是,如果可能的话,我会考虑代理(或外观)。 – user2864740

回答

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 
    } 
} 
+0

该类不是直接使用的,所以我无法扩展并覆盖该方法。 –

1

只有面向对象的Java或反射,你永远不会实现你所要求的。

实际上,改变一个方法的实现是改变你的类的静态部分。这在课程加载后无法实现。

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

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

我建议添加一个环绕建议来短路当前的方法并执行你想要的语句。

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

相关问题