有没有办法在运行时重写一个方法?即使它需要从该实例动态创建子类?是否可以在运行时重写一个方法?
回答
用普通的Java,没有。
With asm or cglib or aspectj,yes。
在纯Java中,在这种情况下要做的事情是创建一个处理方法调用并委托给原始对象(或不是)的interface-based proxy。
我认为它不可能简单的Java。 有了反射和/或cglib,你可以做到。
看看这些链接:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
您可以创建一个anonymous class重写方法和使用strategy pattern来决定做什么。
如果你正在寻找从代码动态编译,你可以按照these instructions
顺便说一句,我用动态编译在.NET中实现脚本化的测试框架。我读了一个C#脚本并编写了一个类:“public class Test {public void Method(){”+ userScript +“}}”。然后,我只是建立了整个事情,并使用反射调用了“Test.Method”,就像在我发送的链接中一样。 –
正如其他人说,不,你不能覆盖在运行时的方法。但是,从Java 8开始,您可以采用功能性方法。 Function
是一个功能接口,允许您将函数视为参考类型。这意味着您可以创建几个并在它们之间切换(动态)a-la战略模式。
让我们来看一个例子:
public class Example {
Function<Integer, Integer> calculateFuntion;
public Example() {
calculateFuntion = input -> input + 1;
System.out.println(calculate(10));
// all sorts of things happen
calculateFuntion = input -> input - 1;
System.out.println(calculate(10));
}
public int calculate(int input) {
return calculateFuntion.apply(input);
}
public static void main(String[] args) {
new Example();
}
}
输出:
我不知道下你打算重写什么情况下和设计,但重点是你替换方法的行为,这是重写的方式。
- 1. 在TypeScript中运行时是否可以检测到重写的方法?
- 2. 是否可以重写Model.objects.all()方法?
- 3. 是否可以编写一个创建方法的方法?
- 4. 是否可以在一个方法内部运行一个函数?
- 5. 是否可以在同一时间运行多个AsyncTask?
- 6. 是否可以“内联”一个“方法”?
- 7. 是否可以重写window.document.location.host?
- 8. 是否可以重写drupal_build_css_cache?
- 9. 是否可以为XAttribute和XElement编写一个方法?
- 10. 是否有可能编写一个方法拣选时间?
- 11. 是否可以用第一个大写字母来重写URL?
- 12. 是否有可能在另一个方法“AsyncTask”中运行“AsyncTask”方法?
- 13. 是否可以在delphi中更改方法体(重写对象方法)?
- 14. 是否有任何算法来判断运行时的Java方法重写?
- 15. 检查在运行时是否正在执行某个方法
- 16. 是否可以重载主方法?
- 17. Web方法是否可以重载?
- 18. 这是否可以重写密封类的方法?
- 19. 是否可以同时运行一个WiX msi实例?
- 20. MongoClient的一个实例是否可以长时间运行
- 21. 是否可以创建“class”运行时?
- 22. 是否有可能相等/重写一个函数/方法与另一个?
- 23. 是否可以在运行时验证ASHX语法错误?
- 24. 在运行时确定Objective-C方法是否可变
- 25. 是否可以编写一个在bash/shell和PowerShell中运行的脚本?
- 26. 是否可以在运行时修改可执行文件?
- 27. 当应用程序未在ios中运行时是否可以调用方法?
- 28. 运行时重命名php文件 - 是否可以锁定?
- 29. 是否有可能重写这个棘手的扩展方法?
- 30. 是否有一种方法可以始终以管理员身份运行vs.net?
为什么?你想做什么? – SLaks
@Maxwell你想做这件事的理由是什么?您是否只能在运行时确定方法的详细信息? –