参数化泛型类实例可以根据类型参数使用不同的方法吗?

时间:2014-09-18 18:35:53

标签: java generics classloader

在回答以下问题时: 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。不需要长代码片段 - 使用标准术语的简短解释就可以了。

1 个答案:

答案 0 :(得分:2)

之所以如此困难是因为Java的内置类加载器在添加后不会重新加载类,并且需要重新加载类(在Java中)以动态添加方法。此外,ClassLoader.resolve()方法是final,这意味着自定义类加载器无法覆盖它。这有很多效果,但最重要的一点是,如果要重新加载一个类,每次要加载它时,必须实例化一个新的ClassLoader

这非常昂贵,因此尝试以这种方式解决Java的局限是没有实际意义的。 (你应该使用另一种更适合这种工作的语言,比如JRuby。)动态加载东西是可能的,但它不值得。

但是,假设你愿意忍受痛苦,你能做到吗?绝对。例如,见this article。那里使用的策略是:

  • 在运行时编译Java代码
  • 通过代理类
  • 在运行时加载/重新加载Java类
  • 将最新的课程链接到其来电者
相关问题