在 Java Play Framework 中扩展默认访问第三方方法
Extending Default Access 3rd Party Method in Java Play Framework
所以我在 Play 应用程序中使用第三方库(即 Echo Nest Java API)。在库公开某些方法的方式上存在一些疏忽,我需要特别修改一个方法,它涉及使用具有默认访问权限的构造函数。
我最初认为在扩展我需要修改的 class 的同一个包中创建一个 class 可以解决问题,但似乎 Java 的运行时包处理阻碍了这种尝试(也就是说,由于不同的 classloader 被用于两个不同的 classes,它们在同一个包中是不够的)。我有一些想法可能会为我的 subclass 或 Echo Nest 库修改 classloader,但几乎不知道如何去做或者是否有更好的解决方案可用。
如有任何正确方向的指点,我们将不胜感激!
所以解决方案是使用 Play 的默认 classloader 加载库 class,将构造函数设置为可访问,然后使用 newInstance()
实例化库class。一些代码,以防其他人遇到类似问题:
// Use the default application classloader to load the library class
Class artistClazz = Play.application().classloader().loadClass("com.echonest.api.v4.Artist");
// Get the package private constructor that we need
Constructor<Artist> constructor = artistClazz.getDeclaredConstructor(EchoNestAPI.class, Map.class);
// Make sure it's accessible to this class
constructor.setAccessible(true);
return constructor.newInstance(this, (Map) mq.getObject("artist"));
我不相信这是解决这个问题的最好或最干净的方法,但它对这个修改后的子程序之外的代码的影响微乎其微class所以我可能会坚持使用它现在。
所以我在 Play 应用程序中使用第三方库(即 Echo Nest Java API)。在库公开某些方法的方式上存在一些疏忽,我需要特别修改一个方法,它涉及使用具有默认访问权限的构造函数。
我最初认为在扩展我需要修改的 class 的同一个包中创建一个 class 可以解决问题,但似乎 Java 的运行时包处理阻碍了这种尝试(也就是说,由于不同的 classloader 被用于两个不同的 classes,它们在同一个包中是不够的)。我有一些想法可能会为我的 subclass 或 Echo Nest 库修改 classloader,但几乎不知道如何去做或者是否有更好的解决方案可用。
如有任何正确方向的指点,我们将不胜感激!
所以解决方案是使用 Play 的默认 classloader 加载库 class,将构造函数设置为可访问,然后使用 newInstance()
实例化库class。一些代码,以防其他人遇到类似问题:
// Use the default application classloader to load the library class
Class artistClazz = Play.application().classloader().loadClass("com.echonest.api.v4.Artist");
// Get the package private constructor that we need
Constructor<Artist> constructor = artistClazz.getDeclaredConstructor(EchoNestAPI.class, Map.class);
// Make sure it's accessible to this class
constructor.setAccessible(true);
return constructor.newInstance(this, (Map) mq.getObject("artist"));
我不相信这是解决这个问题的最好或最干净的方法,但它对这个修改后的子程序之外的代码的影响微乎其微class所以我可能会坚持使用它现在。