[Patch][JDK10] Use Class.getPackageName() where possible
Christoph Dreis
christoph.dreis at freenet.de
Tue Nov 7 14:48:16 UTC 2017
Hi,
> On 11/3/17 6:52 PM, Bernd Eckenfels wrote:
>> The private static helper in ObjectStreamClass became a oneliner and can be removed and the callsites can transform from getPackageName(c) to c.getPackageName().
> Good catch. we should clean that up.
> Christoph - can you send a updated patch to remove ObjectStreamClass::getPackageName and replace the calls with Class::getPackageName and also remove VerifyAccess::getPackageName?
Please find the updated patch below.
Cheers,
Christoph
======= PATCH =======
diff -r 67aa34b019e1 src/java.base/share/classes/java/io/ObjectInputFilter.java
--- a/src/java.base/share/classes/java/io/ObjectInputFilter.java Mon Nov 06 17:48:00 2017 -0800
+++ b/src/java.base/share/classes/java/io/ObjectInputFilter.java Tue Nov 07 15:44:36 2017 +0100
@@ -656,8 +656,8 @@
* otherwise {@code false}
*/
private static boolean matchesPackage(Class<?> c, String pkg) {
- String n = c.getName();
- return n.startsWith(pkg) && n.lastIndexOf('.') == pkg.length() - 1;
+ String n = c.getPackageName();
+ return n.length() == pkg.length() - 1 && n.startsWith(pkg);
}
/**
diff -r 67aa34b019e1 src/java.base/share/classes/java/io/ObjectStreamClass.java
--- a/src/java.base/share/classes/java/io/ObjectStreamClass.java Mon Nov 06 17:48:00 2017 -0800
+++ b/src/java.base/share/classes/java/io/ObjectStreamClass.java Tue Nov 07 15:44:36 2017 +0100
@@ -1580,18 +1580,7 @@
*/
private static boolean packageEquals(Class<?> cl1, Class<?> cl2) {
return (cl1.getClassLoader() == cl2.getClassLoader() &&
- getPackageName(cl1).equals(getPackageName(cl2)));
- }
-
- /**
- * Returns package name of given class.
- */
- private static String getPackageName(Class<?> cl) {
- String s = cl.getName();
- int i = s.lastIndexOf('[');
- i = (i < 0) ? 0 : i + 2;
- int j = s.lastIndexOf('.');
- return (i < j) ? s.substring(i, j) : "";
+ cl1.getPackageName().equals(cl2.getPackageName()));
}
/**
diff -r 67aa34b019e1 src/java.base/share/classes/java/lang/ClassLoader.java
--- a/src/java.base/share/classes/java/lang/ClassLoader.java Mon Nov 06 17:48:00 2017 -0800
+++ b/src/java.base/share/classes/java/lang/ClassLoader.java Tue Nov 07 15:44:36 2017 +0100
@@ -675,12 +675,11 @@
return;
}
- final String name = cls.getName();
- final int i = name.lastIndexOf('.');
- if (i != -1) {
+ final String packageName = cls.getPackageName();
+ if (!packageName.isEmpty()) {
AccessController.doPrivileged(new PrivilegedAction<>() {
public Void run() {
- sm.checkPackageAccess(name.substring(0, i));
+ sm.checkPackageAccess(packageName);
return null;
}
}, new AccessControlContext(new ProtectionDomain[] {pd}));
diff -r 67aa34b019e1 src/java.base/share/classes/java/lang/reflect/Proxy.java
--- a/src/java.base/share/classes/java/lang/reflect/Proxy.java Mon Nov 06 17:48:00 2017 -0800
+++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java Tue Nov 07 15:44:36 2017 +0100
@@ -1034,11 +1034,8 @@
// do permission check if the caller is in a different runtime package
// of the proxy class
- int n = proxyClass.getName().lastIndexOf('.');
- String pkg = (n == -1) ? "" : proxyClass.getName().substring(0, n);
-
- n = caller.getName().lastIndexOf('.');
- String callerPkg = (n == -1) ? "" : caller.getName().substring(0, n);
+ String pkg = proxyClass.getPackageName();
+ String callerPkg = caller.getPackageName();
if (pcl != ccl || !pkg.equals(callerPkg)) {
sm.checkPermission(new ReflectPermission("newProxyInPackage." + pkg));
diff -r 67aa34b019e1 src/java.base/share/classes/sun/invoke/util/VerifyAccess.java
--- a/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Mon Nov 06 17:48:00 2017 -0800
+++ b/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Tue Nov 07 15:44:36 2017 +0100
@@ -332,16 +332,6 @@
return Objects.equals(class1.getPackageName(), class2.getPackageName());
}
- /** Return the package name for this class.
- */
- public static String getPackageName(Class<?> cls) {
- assert (!cls.isArray());
- String name = cls.getName();
- int dot = name.lastIndexOf('.');
- if (dot < 0) return "";
- return name.substring(0, dot);
- }
-
/**
* Test if two classes are defined as part of the same package member (top-level class).
* If this is true, they can share private access with each other.
More information about the core-libs-dev
mailing list