RFR: 8060130: Simplify the synchronization of defining and getting java.lang.Package
Mandy Chung
mandy.chung at oracle.com
Thu Oct 23 00:54:28 UTC 2014
On 10/22/2014 4:58 PM, Claes Redestad wrote:
>
>>
>> A minor nit: Package.java line 636: it can return EMPTY_MANIFEST
>> that will set manifest to non-null so that an invalid file would
>> avoid opening the file every time getManifest is called (although
>> this case rarely happens). line 639 can then be simplified.
>
> We need to consider the case where JarInputStream.getManifest()
> returns null, which would mean we'd either end up no simpler on line
> 639 or simply adding a similar check around the value returned from
> jis.getManifest(). I also think I saw that referencing the static
> EMPTY_PACKAGES from within the privileged anonymous class adds
> synthetic access methods...
>
> More importantly, the current approach should already ensure any file
> is only scanned once by virtue of always setting manifest to a
> non-null value in the end. No?
That's right. I missed that you did set manifest to non-null in line
639. That's fine then.
>
>
> Yes, I've run the test via JPRT and verified it gets picked up and run
> using the default testset, so Windows, Solaris, Mac and Linux should
> be covered.
That's good.
>
>>
>> This test uses a special class loader that delegates to null class
>> loader only. Since you have the verification in place, it'd be good
>> to also call Package.getPackage and Package.getPackages to verify
>> that the same "package2" instance is returned. As a sanity check,
>> you could check "java.lang" package must be present.
>
> I've added some sanity checks as suggested. Sadly, it seems that since
> the application classloader will define and load package2 first in
> this test, there'll always be a Package defined in the
> ClassLoader.pkgs that will mask the Package instance in Package.pkgs
> when retrieved via the public methods in Package.
Can you remove package2/Class2.class after you create the jar files?
> If JDK-8061804 is resolved, we could change to check for identity in
> the Package.getPackages() case, which would improve the specificness
> of the test... For now, perhaps we could trick things in this test and
> put our dummy class into java.lang in our test here and ensure that
> the package retrieved is identical. Worth the hassle?
What I meant is to check if the returned Package contains "java.lang"
package that always exists in the system packages. You don't need to
put a dummy class in java.lang to get "java.lang" Package since it must
be defined in the running VM. e.g. you can refactor line 169-176 to a
findPackage method that returns Package matching the given package name
such that in line 164 you can call findPackage("java.lang") that should
return non-null.
>
>> Nit: line 35-37, 43-46 - no need to declare these import as
>> java.lang.* are imported by default.
>
> Some IDEs...
>
Which IDE are you using? I think it might be your configuration.
Thanks
Mandy
More information about the core-libs-dev
mailing list