8009857: Problem with plugin

Reviewed-by: jdn, mchung
This commit is contained in:
Stuart Marks 2013-03-18 18:15:59 -07:00
parent d059d367eb
commit 3a4936696c

View File

@ -46,8 +46,28 @@ import sun.misc.IOUtils;
class Trampoline {
static {
if (Trampoline.class.getClassLoader() == null) {
throw new Error(
"Trampoline must not be defined by the bootstrap classloader");
}
}
private static void ensureInvocableMethod(Method m)
throws InvocationTargetException
{
Class<?> clazz = m.getDeclaringClass();
if (clazz.equals(AccessController.class) ||
clazz.equals(Method.class) ||
clazz.getName().startsWith("java.lang.invoke."))
throw new InvocationTargetException(
new UnsupportedOperationException("invocation not supported"));
}
private static Object invoke(Method m, Object obj, Object[] params)
throws InvocationTargetException, IllegalAccessException {
throws InvocationTargetException, IllegalAccessException
{
ensureInvocableMethod(m);
return m.invoke(obj, params);
}
}
@ -251,16 +271,6 @@ public final class MethodUtil extends SecureClassLoader {
*/
public static Object invoke(Method m, Object obj, Object[] params)
throws InvocationTargetException, IllegalAccessException {
if (m.getDeclaringClass().equals(AccessController.class) ||
(m.getDeclaringClass().equals(java.lang.invoke.MethodHandles.class)
&& m.getName().equals("lookup")) ||
(m.getDeclaringClass().equals(java.lang.invoke.MethodHandles.Lookup.class)
&& (m.getName().startsWith("find") ||
m.getName().startsWith("bind") ||
m.getName().startsWith("unreflect"))) ||
m.getDeclaringClass().equals(Method.class))
throw new InvocationTargetException(
new UnsupportedOperationException("invocation not supported"));
try {
return bounce.invoke(null, new Object[] {m, obj, params});
} catch (InvocationTargetException ie) {
@ -293,10 +303,10 @@ public final class MethodUtil extends SecureClassLoader {
Method.class, Object.class, Object[].class
};
Method b = t.getDeclaredMethod("invoke", types);
((AccessibleObject)b).setAccessible(true);
return b;
}
});
b.setAccessible(true);
return b;
}
});
} catch (Exception e) {
throw new InternalError("bouncer cannot be found", e);
}