0

所以我在 Play 应用程序中使用了第三方库(即 Echo Nest Java API)。在库如何公开某些方法方面存在一些疏忽,我需要特别修改一种方法,其中涉及使用具有默认访问权限的构造函数。

我最初认为在扩展我需要修改的类的同一个包中创建一个类可以解决问题,但似乎 Java 的运行时包处理阻止了这种尝试(也就是说,因为这两个类使用了不同的类加载器不同的类,它们在同一个包中是不够的)。我有一些可能为我的子类或 Echo Nest 库修改类加载器的想法,但几乎不知道如何去做,或者是否有更好的解决方案可用。

任何正确方向的指针将不胜感激!

4

1 回答 1

1

所以原来的解决方案是使用 Play 的默认类加载器加载库类,将构造函数设置为可访问,然后用于newInstance()实例化库类。一些代码,以防其他人遇到类似问题:

// 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"));

我不相信这是解决这个问题的最好或最干净的解决方案,但它对这个修改后的子类之外的代码的影响最小,所以我现在可能会坚持下去。

于 2016-02-22T05:33:46.463 回答