< prev index next >
src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java
Print this page
@@ -133,10 +133,28 @@
security.checkPermission(reflectionFactoryAccessPerm);
}
return soleInstance;
}
+ /**
+ * Returns an alternate reflective Method instance for the given method
+ * intended for reflection to invoke, if present.
+ *
+ * A trusted method can define an alternate implementation for a method `foo`
+ * by defining a method named "reflected$foo" that will be invoked
+ * reflectively.
+ */
+ private static Method findMethodForReflection(Method method) {
+ String altName = "reflected$" + method.getName();
+ try {
+ return method.getDeclaringClass()
+ .getDeclaredMethod(altName, method.getParameterTypes());
+ } catch (NoSuchMethodException ex) {
+ return null;
+ }
+ }
+
//--------------------------------------------------------------------------
//
// Routines used by java.lang.reflect
//
//
@@ -159,10 +177,19 @@
}
public MethodAccessor newMethodAccessor(Method method) {
checkInitted();
+ boolean noInflation = ReflectionFactory.noInflation;
+ if (Reflection.isCallerSensitive(method)) {
+ Method altMethod = findMethodForReflection(method);
+ if (altMethod != null) {
+ method = altMethod;
+ noInflation = true; // in this case only
+ }
+ }
+
if (noInflation && !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())) {
return new MethodAccessorGenerator().
generateMethod(method.getDeclaringClass(),
method.getName(),
method.getParameterTypes(),
< prev index next >