On Wed, 8 Oct 2025 05:11:12 GMT, Alan Bateman <[email protected]> wrote:

>> --add-opens java.base/java.lang=ALL-UNNAMED is for the reflective access to 
>> "defineClass" of the platform classloader. any better alternative to test 
>> the platform classloader's defineClass behavior other than the reflect api? 
>> 
>> 
>>             Method m = ClassLoader.class.getDeclaredMethod(
>>                     "defineClass", String.class, ByteBuffer.class, 
>> ProtectionDomain.class
>>             );
>>             m.setAccessible(true);
>>             Class<?> clazz = (Class<?>) m.invoke(builtin, null, bb, null);
>> 
>> 
>> The dup  @run lines are the workaround to test the platform classloader's 
>> defineClass on the same target test class  class twice, one for the direct 
>> bb, one for the heap bb (with 2 separate vm runs). Otherwise the test fails 
>> with "java.lang.LinkageError: loader 'platform' attempted duplicate class 
>> definition for Greeting."
>> 
>> Does ParameterizedTest support vm/platform classloader isolation for each 
>> parameterized test run against the same test with different parameters?
>
>> Does ParameterizedTest support vm/platform classloader isolation for each 
>> parameterized test run against the same test with different parameters?
> 
> I should have been clearer in my comment. The suggestion to use a 
> ParameterizedTest is to exercise a custom class loader using 
> super.defineClass with different buffers (direct, heap, position != 0, ...) 
> so that it exercises the "non-trusted" cases.
> 
> You are right that testing the platform class loader (as a trusted class 
> loader) will require opening java.lang.

The test case has been updated to use @ParameterizedTest for the user-defined 
classloader, for the following variants.


    static Stream<Arguments> bufferTypes() {
        return Stream.of(
                arguments(ARRAY_BUFFER, 0, false),
                arguments(ARRAY_BUFFER_READONLY, 0, true),
                arguments(DIRECT_BUFFER, 0, false),
                arguments(DIRECT_BUFFER_READONLY, 0, false),
                arguments(ARRAY_BUFFER, 16, false),
                arguments(ARRAY_BUFFER_READONLY, 16, true),
                arguments(DIRECT_BUFFER, 16, false),
                arguments(DIRECT_BUFFER_READONLY, 16, false)
        );
    }


I keep the built-in classloader testing asis in the same test file for now. Let 
me know if you have a strong opinion to split it out.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/27569#discussion_r2418010283

Reply via email to