RFR(M): 8199940: Print more information about class loaders in IllegalAccessErrors.
Lois Foltan
lois.foltan at oracle.com
Fri Jun 8 13:39:04 UTC 2018
> Hi Mandy,
>
> I like this proposal a lot.
> * it contains all necessary information
> * I like that it also contains the @id
> * I like that the major message is in a clear sentence at the
> beginning, the further information in parentheses at the end.
>
> I don't care about single or double quotes, but in the messages
> I only saw double quotes so far. A lot of messages will have to
> be changed to make this consistent.
>
> About the implementation:
>
> Do I understand correctly that
> classLoaderData::loader_name() should be changed to return either of
> com.acme.MySameClassLoader at 423aefd2
> 'app'
> 'Cool lib loader' @4567 (is the space before @ intended?)
> and Klass::class_loader_and_module_name(verbose) should return
> test.IAE1_B in unnamed module of loader com.acme.MySameClassLoader at 423aefd2
> test.IAE1_A in unnamed module of loader 'app'
> p2.C2 in module m2x at 9.0 of loader 'app'
> p1.C1 in module m1x at 2.0 of loader 'app'
>
> Also, there currently are
> Klass::external_name()
> Klass::class_loader_and_module_name()
> classLoaderData::loader_name()
> java_lang_ClassLoader::name()
> java_lang_ClassLoader::describe_external()
>
> These function names are often misunderstood.
> It's unclear that classLoaderData::loader_name() and
> java_lang_ClassLoader::name() do different things,
> loader_name let's one assume it returns the name field
> of the ClassLoader class.
Hi Goetz,
Glad you like the proposal. I am currently working on consolidating all
the above methods you list into something more consistent for class
loaders. See https://bugs.openjdk.java.net/browse/JDK-8202605.
>
> Klass::class_loader_and_module_name() sounds as if
> only the name of the classloader and the name of
> the module are printed, not the name of the class.
>
> Maybe we should rename like this:
> Klass::class_loader_and_module_name() --> full_class_description
> classLoaderData::loader_name() --> full_loader_description
I will also be working on implementing new utility methods probably
within Klass to be used consistently by the various error messages. See
the RFE, https://bugs.openjdk.java.net/browse/JDK-8169559. I may decide
to either remove Klass::class_loader_and_module_name() or rename it to
something very specific to indicate that it is the format that is used
for StackTraceElement toString() as documented at
https://docs.oracle.com/javase/9/docs/api/java/lang/StackTraceElement.html#toString--.
So there may be value in keeping it. I will address this as well in
JDK-8169559.
Thanks,
Lois
>
> Best regards,
> Goetz.
>
>> -----Original Message-----
>> From: mandy chung [mailto:mandy.chung at oracle.com]
>> Sent: Donnerstag, 7. Juni 2018 19:49
>> To: Lindenmaier, Goetz <goetz.lindenmaier at sap.com>; Lois Foltan
>> <lois.foltan at oracle.com>
>> Cc: hotspot-runtime-dev at openjdk.java.net
>> Subject: Re: RFR(M): 8199940: Print more information about class loaders in
>> IllegalAccessErrors.
>>
>> Hi Goetz,
>>
>> We have discussed several options to include the loader info that
>> developers reading the exception message can easily tell the
>> problem and reason. We look at a few exception messages and
>> like the following most:
>>
>> class test.IAE1_B cannot access its superinterface test.IAE1_A
>> (test.IAE1_B in unnamed module of loader com.acme.MySameClassLoader
>> @423aefd2; test.IAE1_A in unnamed module of loader 'app')
>>
>> class p1.C1 cannot access private method p2.C2.method2()V
>> (p1.C1 in module m1x at 2.0 of loader 'app'; p2.C2 in module m2x at 9.0 of
>> loader 'app')
>>
>> class p.C cannot access class jdk.internal.misc.VM (p.C in unnamed
>> module of loader 'Cool lib loader' @4567; jdk.internal.misc.VM in module
>> java.base; java.base does not export jdk.internal.misc to the unnamed
>> module)
>>
>> loader constraint violation for type pkg.Foo:
>> class pkg.Child tried to access pkg.Parent._field1, a field of type
>> pkg.Foo, but pkg.Child and pkg.Parent see different definitions of
>> pkg.Foo
>> (pkg.Child in unnamed module of loader pkg.ClassLoaderForChildGrandFoo
>> @123, parent loader 'app'; pkg.Parent in unnamed module of loader
>> pkg.ClassLoaderForParentFoo @456, parent loader 'app')
>>
>> Below describes the preliminary proposal of the format.
>>
>> If the loader name is explicitly specified then
>> ... of loader '<name>' @<id>
>>
>> If the loader name is not explicitly specified
>> ... of loader <qualified-type-name> @<id>
>>
>> - single-quote denotes it's explicitly specified loader name.
>> The loader name explicitly specified may contain whitespace.
>>
>> - @<id> can distinct different instances with the same loader name
>> or of the same type.
>>
>> - omit @<id> for built-in loaders
>>
>> Your feedback is appreciated.
>>
>> Lois is on vacation. I think it may be best for her to take this RFE
>> and implement the new format once we agree on the proposal as this
>> would need to update some exception wordings to make the problem
>> and reason very clear.
>>
>> Mandy
More information about the hotspot-runtime-dev
mailing list