java.lang.reflect.Method.copyOf (original) (raw)
John Rose john.r.rose at oracle.com
Wed Oct 14 20:42:50 UTC 2015
- Previous message: java.lang.reflect.Method.copyOf
- Next message: java.lang.reflect.Method.copyOf
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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.
- Previous message: java.lang.reflect.Method.copyOf
- Next message: java.lang.reflect.Method.copyOf
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]