java.lang.reflect.Method.copyOf
John Rose
john.r.rose at oracle.com
Wed Oct 14 20:42:50 UTC 2015
On Oct 14, 2015, at 3:38 AM, Remi Forax <forax at univ-mlv.fr> wrote:
>
> Given that j.l.r.Method is mutable, the best way to have performance is too encapsulate it in a non mutable class, if possible.
OK, I'll bite. Here's a way to make Method its own non-mutable encapsulation, a la List::set or (future feature) frozen arrays.
diff --git a/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java b/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java
--- a/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java
+++ b/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java
@@ -120,15 +120,36 @@
*
* @param flag the new value for the {@code accessible} flag
* @throws SecurityException if the request is denied.
+ * @throws UnsupportedOperationException if the accessible object is frozen
* @see SecurityManager#checkPermission
* @see java.lang.RuntimePermission
*/
- public void setAccessible(boolean flag) throws SecurityException {
+ public void setAccessible(boolean flag) throws SecurityException, UnsupportedOperationException {
+ checkFrozen();
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(ACCESS_PERMISSION);
setAccessible0(this, flag);
}
+ protected void checkFrozen() {
+ if (frozen) throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Make a frozen copy of this accessible object, with the accessible
+ * bit set to false. If this object is already frozen, return the
+ * same object. If this object is not already frozen, return a frozen
+ * copy, with the accessibility flag forced to {@code false}.
+ */
+ public abstract AccessibleObject asNonAccessible();
+
+ /**
+ * Return {@code true} if this object was produced by {@link #isNonAccessible}.
+ */
+ public boolean isNonAccessible() {
+ return frozen;
+ }
+
/* Check that you aren't exposing java.lang.Class.<init> or sensitive
fields in java.lang.Class. */
private static void setAccessible0(AccessibleObject obj, boolean flag)
@@ -166,6 +187,9 @@
// outside this package.
boolean override;
+ // Indicates whether this object is frozen in the non-accessible state.
+ boolean frozen;
+
// Reflection factory used by subclasses for creating field,
// method, and constructor accessors. Note that this is called
// very early in the bootstrapping process.
More information about the core-libs-dev
mailing list