帖子https://forums.oracle.com/thread/2280127证实了这一点
并由 Oracle http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/mixed_code.html#trusted_library确认
“如果要使用受信任库清单属性标记的 jar 文件中的代码使用依赖于类加载器的调用,则可能需要稍微修改 [...] 受信任库中的代码可以查找正常的加载器通过调用 Thread.currentThread().getContextClassLoader().[...] 通常,必须注意确保受信任库中的代码以谨慎和安全的方式编写,并且与在单独的来自任何剩余 jar 的类加载器实例,这些 jar 是应用程序的一部分,由普通加载器加载。”
“Thread.currentThread().getContextClassLoader().[...]”
我只是做了一个简单的测试,将一个受信任的 jar 中的方法调用到沙盒 jar 中,我使用反射来做到这一点并且它有效。
似乎每次使用受信任的 jar 文件中的任何沙箱 jar 文件类,我们都必须使用反射(加载类,调用所需的方法)。这是前进的方向吗。有人可以证实这一点。
私人无效使用反射(){尝试{
// using normal class loader
Class<?> clazz = Class.forName("com.abc.bla.bla.SandBox", true, Thread.currentThread().getContextClassLoader());
Constructor<?> constructor = clazz.getConstructor();
Object obj = constructor.newInstance(new Object[] {});
Method method = clazz.getMethod("sayHello", new Class[] {});
method.invoke(obj, new Object[] {});
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
总之,似乎我们必须使用反射来加载沙箱 jar 文件(不受信任)以允许使用普通类加载器并避免默认的通过 import 语句,这是为签名(受信任)jar 设计的特殊语句根据清单附加属性处于混合模式的文件。