我试图在GAE运行时中做一些需要“嘲弄”的事情:
private Mongo createMongo() {
Mongo mongo = Mockito.mock(Mongo.class);
...
}但是,这显然会导致错误,因为“反射”是一个受限的类:
java.lang.NoClassDefFoundError: sun.reflect.ReflectionFactory is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.<init>(SunReflectionFactoryInstantiator.java:24)
at org.objenesis.strategy.StdInstantiatorStrategy.newInstantiatorOf(StdInstantiatorStrategy.java:65)
at org.objenesis.ObjenesisBase.getInstantiatorOf(ObjenesisBase.java:76)
at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:111)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:51)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:52)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:41)
at org.mockito.Mockito.mock(Mockito.java:1014)
at org.mockito.Mockito.mock(Mockito.java:909)sun.reflect的“模拟”库可以进行反射?@Reflectable之类的更新:
早在2010年我就发现了一个类似的问题:
https://groups.google.com/forum/?fromgroups=#!topic/google-appengine-java/uIWRftGl-fA
不过,直到现在还没有回答。
发布于 2014-10-14 00:09:23
应用程序引擎应用程序在沙箱中运行,这限制了它们所能做的事情。关于沙箱的概述可以在这里找到:
沙箱限制之一是对应用程序可以访问的jre绑定类的限制。允许应用程序访问的jre捆绑类的完整列表如下所示:
https://cloud.google.com/appengine/docs/java/jrewhitelist
为什么ReflectionFactory本身不在此可访问类列表中?如果您阅读该类的javadocs,您会发现以下语句:“该类中的方法非常不安全,可能导致语言和验证器的颠覆。”因此,这个类可以用来颠覆沙箱。
https://stackoverflow.com/questions/15727135
复制相似问题