RFR: 8037325: Class.getConstructor() performance regression

Christoph Dreis christoph.dreis at freenet.de
Fri Jan 13 12:29:37 UTC 2017


your extraction of methodName() made me aware of another small thing. What about rewriting argumentTypesToString() to avoid creating the StringJoiner if not needed?

    private static String argumentTypesToString(Class<?>[] argTypes) {
        if (argTypes != null) {
            StringJoiner sj = new StringJoiner(", ", "(", ")");
            for (int i = 0; i < argTypes.length; i++) {
                Class<?> c = argTypes[i];
                sj.add((c == null) ? "null" : c.getName());
            return sj.toString();
        return "()";

Should have a very minor impact though. Apart from that looks good to me.


-----Original Message-----
From: core-libs-dev [mailto:core-libs-dev-bounces at openjdk.java.net] On Behalf Of Claes Redestad
Sent: Thursday, January 12, 2017 3:48 PM
To: core-libs-dev Libs <core-libs-dev at openjdk.java.net>; Security Dev OpenJDK <security-dev at openjdk.java.net>
Subject: RFR: 8037325: Class.getConstructor() performance regression


please review this fix to various performance regressions observed
as the security model has evolved over the years.

Bug: https://bugs.openjdk.java.net/browse/JDK-8037325
Webrev: http://cr.openjdk.java.net/~redestad/8037325/webrev.01

- For cases where a SecurityManager is not installed, this improves
performance by avoiding calls to Reflection.getCallerClass, which
can be very expensive when not inlined. Regrettably this adds some

- For cases where a SecurityManager is installed, this improves
performance slightly by avoiding repeated calls to 
System.getSecurityManager (which does volatile read).

- Use of Class.getPackageName when appropriate reduce the
number of allocations done.

- Places where doPrivileged calls were used to bypass access checking 
when calling methods on Class can safely be replaced by calling
corresponding private methods directly if care is taken to copy the
end result as appropriate.

- Finally, by using the recently used 
ReflectionFactory.getExecutableSharedParameterTypes we also get rid of
some unnecessary copying.



More information about the security-dev mailing list