RFR: 8302791: Add specific ClassLoader object to Proxy IllegalArgumentException message [v4]
Ravali Yatham
duke at openjdk.org
Mon Mar 6 11:08:42 UTC 2023
On Thu, 2 Mar 2023 20:00:24 GMT, Mandy Chung <mchung at openjdk.org> wrote:
>>> Thanks @AlanBateman. Regarding the separator, Have seen this being used in ClassLoader.java for nameAndId method. Hence used the same for consistency. I've reformatted L886 now, Please kindly check.
>>
>> Thanks for checking, the updated version looks good.
>
> I suggest to add a `JavaLangAccess::getLoaderNameID(ClassLoader loader)` so that Proxy (and other classes) can use the same representation.
>
> The patch will look like this:
>
>
> diff --git a/src/java.base/share/classes/java/lang/ClassLoader.java b/src/java.base/share/classes/java/lang/ClassLoader.java
> index 2bc9a22700a..f412ecfa3ae 100644
> --- a/src/java.base/share/classes/java/lang/ClassLoader.java
> +++ b/src/java.base/share/classes/java/lang/ClassLoader.java
> @@ -407,6 +407,10 @@ public abstract class ClassLoader {
> return nid;
> }
>
> + String nameAndId() {
> + return nameAndId;
> + }
> +
> /**
> * Creates a new class loader of the specified name and using the
> * specified parent class loader for delegation.
> diff --git a/src/java.base/share/classes/java/lang/System.java b/src/java.base/share/classes/java/lang/System.java
> index 501ed47fcad..c138ea9fef5 100644
> --- a/src/java.base/share/classes/java/lang/System.java
> +++ b/src/java.base/share/classes/java/lang/System.java
> @@ -2663,6 +2663,10 @@ public final class System {
> Continuation continuation) {
> return StackWalker.newInstance(options, null, contScope, continuation);
> }
> +
> + public String getLoaderNameID(ClassLoader loader) {
> + return loader.nameAndId();
> + }
> });
> }
> }
> diff --git a/src/java.base/share/classes/java/lang/reflect/Proxy.java b/src/java.base/share/classes/java/lang/reflect/Proxy.java
> index 6064dcf5b6b..a2a9a03e6c4 100644
> --- a/src/java.base/share/classes/java/lang/reflect/Proxy.java
> +++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java
> @@ -878,7 +878,7 @@ public class Proxy implements java.io.Serializable {
> }
> if (type != c) {
> throw new IllegalArgumentException(c.getName() +
> - " referenced from a method is not visible from class loader");
> + " referenced from a method is not visible from class loader: " + JLA.getLoaderNameID(ld));
> }
> }
>
> diff --git a/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java b/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java
> index 39adfb2130a..4720e589efb 100644
> --- a/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java
> +++ b/src/java.base/share/classes/jdk/internal/access/JavaLangAccess.java
> @@ -564,4 +564,6 @@ public interface JavaLangAccess {
> StackWalker newStackWalkerInstance(Set<StackWalker.Option> options,
> ContinuationScope contScope,
> Continuation continuation);
> +
> + String getLoaderNameID(ClassLoader loader);
> }
@mlchung - Thanks for suggesting this so as to reuse the existing `nameAndId` functionality in Proxy class. I've pushed new commit, Please kindly review.
-------------
PR: https://git.openjdk.org/jdk/pull/12641
More information about the core-libs-dev
mailing list