在回答以下问题时: How do I create a Builder that can build more than one kind of Java object?我认为在Java中实现以下内容是不可能的:
public class Builder<T> {
// ...
}
Builder<User> userBuilder = new Builder<User>();
// here userBuilder only has method 'name'
userBuilder.name("John");
Builder<Country> countryBuilder = new Builder<Country>();
// here countryBuilder only has method 'code'
countryBuilder.code("UA");
但是,在评论中,用户John Feminella告诉它实际上可以使用自定义类加载器。
现在,我了解Java中类加载器的基础知识,但实际上并不知道它们如何改变Java语法。有人可以就如何实现这一目标提出基本想法吗?
提前致谢!
P.S。不需要长代码片段 - 使用标准术语的简短解释就可以了。
答案 0 :(得分:2)
之所以如此困难是因为Java的内置类加载器在添加后不会重新加载类,并且需要重新加载类(在Java中)以动态添加方法。此外,ClassLoader.resolve()
方法是final
,这意味着自定义类加载器无法覆盖它。这有很多效果,但最重要的一点是,如果要重新加载一个类,每次要加载它时,必须实例化一个新的ClassLoader
。
这非常昂贵,因此尝试以这种方式解决Java的局限是没有实际意义的。 (你应该使用另一种更适合这种工作的语言,比如JRuby。)动态加载东西是可能的,但它不值得。
但是,假设你愿意忍受痛苦,你能做到吗?绝对。例如,见this article。那里使用的策略是: