Java以编程方式扩展

时间:2016-04-29 07:51:22

标签: java class dynamic hierarchy

我想知道如何更换Java'扩展'关键字以某种方式根据参数(文件,环境变量,db ...基本上任何东西)动态扩展一个类。这甚至是可能的,因为使用类加载器或调用构造函数并不能实现这一点。我不是要求#34;我应该使用接口或超类层次结构"更确切地说,扩展在JAVA的引擎盖下真的意味着什么,因为没有任何关于它的良好描述只是好的旧继承术语:

https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

3 个答案:

答案 0 :(得分:1)

“替换Dim xyzTotal As Decimal? = ins?.DCovers? _ .Where(Function(x) x.Event.Code.ToUpper().Contains("TPD")) _ .Sum(Function(x) x.Value) 关键字”的唯一方法是在运行时动态创建类,这完全可能但非平凡。 Vert.x是一个充分利用动态生成的类的项目的一个很好的例子。

在这个意义上,Java并不是设计为动态语言。有几种动态语言(其中一些可以在JVM上运行),例如JavaScript。

  更确切地说,扩展真正意味着什么......

如果您没有参考OOP的长篇论文,当您说extends时,就意味着Derived extends Base继承了Derived的公共API和受保护的API(它可以添加到其中)以及该API的实施。这意味着期望看到Base实例的代码可以接受Base实例,因为Derived“是”Derived。此链接是在编译时创建的。在运行时,实例化Base的实例涉及实例化Derived实例所涉及的所有管道,再加上Base添加的管道。

答案 1 :(得分:0)

您无法使用Java等语言来实现这一目标。关于"继承的信息"不仅被编译器使用,它还被“烧烤”#34;进入编译后的字节码。

如果你真的想要这样的"动态"元编程;你最好使用允许你这样做的语言;而不是"违反"一种从未用于此类用途的语言。

使用一些愚蠢的比较:只是因为你碰巧知道"螺丝"和"锤子" ......你不会开始用锤子将那些螺钉钉在墙上,对吗?相反,你会寻找一种能更好地使用"螺丝"而不是锤子。

如果您仍希望代码在JVM中运行;你可能会考虑像jython或jruby这样的语言。

答案 2 :(得分:0)

要实现这一点,您需要根据条件维护类的各种版本,并且您还必须自定义类加载器,因为当您发现必须加载特定实例时,您需要加载该类在JVM启动时默认的类加载器没有加载它。

最好维护类的多个版本,让JVM完成它的工作。