Java 以编程方式扩展
Java extends programmatically
我想知道如何以某种方式替换 Java 的 'extends' 关键字以基于参数(文件、环境变量、数据库...基本上任何东西)动态扩展 class .这甚至可能吗,因为使用 class 加载器或调用构造函数无法实现这一点。我不是在问 "should I use interface or superclass hierarchy",而是在 JAVA 中扩展的真正含义是什么,因为没有关于它的任何好的描述,只是很好的继承术语:
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
你不能用像 Java 这样的语言来做到这一点。关于"inheritance"的信息不仅被编译器使用,它也"hard-baked"进入编译后的字节码。
如果你真的想要这样的 "dynamic" 元编程;你最好使用允许你这样做的语言;而不是 "violating" 一种从未打算用于此类用法的语言。
使用一些愚蠢的比较:仅仅因为你碰巧知道 "screws" 和 "hammer" ...你不会开始用锤子把那些螺丝钉进墙上,对吗? ?相反,您会寻找一种比锤子更适合 "screws" 的工具。
如果您仍希望代码在 JVM 中 运行;您可能会考虑像 jython 或 jruby 这样的语言。
要实现这一点,您需要根据条件维护 class 的各种版本,并且还必须自定义 class 加载程序,因为在某个时候您发现必须加载一个特定的实例,你需要在 JVM 启动时加载 class 默认情况下未加载的 class 加载程序。
最好维护 class 的多个版本,让 JVM 完美地完成它的工作。
"replace the extends
keyword" 的唯一方法是在 运行 时动态创建 类,这是完全可能的,但并非易事。 Vert.x 是广泛使用动态生成的 类.
项目的一个很好的例子
从这个意义上说,Java 并没有被设计成动态语言。有几种动态语言(其中一些可以 运行 在 JVM 上),例如 JavaScript.
rather what is extending really mean under the hood...
无需对 OOP 进行长篇大论,当您说 Derived extends Base
时,这意味着 Derived
继承了 public 和受保护的 API [=13] =](然后它可以添加)以及 API 的实现。这意味着期望看到 Base
实例的代码可以接受 Derived
实例,因为 Derived
"is a" Base
。这个 link 是在编译时创建的。在 运行 时间,实例化 Derived
的实例涉及实例化 Base
实例涉及的所有管道,再加上为 Derived
.
添加的管道
我想知道如何以某种方式替换 Java 的 'extends' 关键字以基于参数(文件、环境变量、数据库...基本上任何东西)动态扩展 class .这甚至可能吗,因为使用 class 加载器或调用构造函数无法实现这一点。我不是在问 "should I use interface or superclass hierarchy",而是在 JAVA 中扩展的真正含义是什么,因为没有关于它的任何好的描述,只是很好的继承术语:
https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
你不能用像 Java 这样的语言来做到这一点。关于"inheritance"的信息不仅被编译器使用,它也"hard-baked"进入编译后的字节码。
如果你真的想要这样的 "dynamic" 元编程;你最好使用允许你这样做的语言;而不是 "violating" 一种从未打算用于此类用法的语言。
使用一些愚蠢的比较:仅仅因为你碰巧知道 "screws" 和 "hammer" ...你不会开始用锤子把那些螺丝钉进墙上,对吗? ?相反,您会寻找一种比锤子更适合 "screws" 的工具。
如果您仍希望代码在 JVM 中 运行;您可能会考虑像 jython 或 jruby 这样的语言。
要实现这一点,您需要根据条件维护 class 的各种版本,并且还必须自定义 class 加载程序,因为在某个时候您发现必须加载一个特定的实例,你需要在 JVM 启动时加载 class 默认情况下未加载的 class 加载程序。
最好维护 class 的多个版本,让 JVM 完美地完成它的工作。
"replace the extends
keyword" 的唯一方法是在 运行 时动态创建 类,这是完全可能的,但并非易事。 Vert.x 是广泛使用动态生成的 类.
Java 并没有被设计成动态语言。有几种动态语言(其中一些可以 运行 在 JVM 上),例如 JavaScript.
rather what is extending really mean under the hood...
无需对 OOP 进行长篇大论,当您说 Derived extends Base
时,这意味着 Derived
继承了 public 和受保护的 API [=13] =](然后它可以添加)以及 API 的实现。这意味着期望看到 Base
实例的代码可以接受 Derived
实例,因为 Derived
"is a" Base
。这个 link 是在编译时创建的。在 运行 时间,实例化 Derived
的实例涉及实例化 Base
实例涉及的所有管道,再加上为 Derived
.