This is an automated email from the ASF dual-hosted git repository.
benw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
The following commit(s) were added to refs/heads/master by this push:
new e45fc77dc core: ThrowawayClassLoader extract test logic to actual test
e45fc77dc is described below
commit e45fc77dc8063d5cd7ac428de0f24ba7008baf69
Author: Ben Weidig <[email protected]>
AuthorDate: Sat Aug 30 13:37:42 2025 +0200
core: ThrowawayClassLoader extract test logic to actual test
---
.../tapestry5/internal/ThrowawayClassLoader.java | 83 +++++++---------------
.../internal/ThrowawayClassLoaderTest.java | 47 ++++++++++++
2 files changed, 74 insertions(+), 56 deletions(-)
diff --git
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
index 62c133210..7db3c6ff7 100644
---
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
+++
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/ThrowawayClassLoader.java
@@ -1,4 +1,4 @@
-// Copyright 2024 The Apache Software Foundation
+// Copyright 2024, 2025 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -14,92 +14,63 @@
package org.apache.tapestry5.internal;
-import static org.junit.Assert.assertNotEquals;
-
import org.apache.tapestry5.internal.plastic.PlasticInternalUtils;
public class ThrowawayClassLoader extends ClassLoader
{
+ private final ClassLoader parent;
- final private ClassLoader parent;
-
- public ThrowawayClassLoader(ClassLoader parent)
+ public ThrowawayClassLoader(ClassLoader parent)
{
super(parent);
this.parent = parent;
}
-
+
@Override
- protected Class<?> loadClass(String name, boolean resolve) throws
ClassNotFoundException
+ protected Class<?> loadClass(String name, boolean resolve) throws
ClassNotFoundException
{
- synchronized (getClassLoadingLock(name))
-
+ synchronized (getClassLoadingLock(name))
{
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
- if (c == null) {
- if (name.contains(".base.") || name.contains(".pages.") ||
- name.contains(".components.") ||
name.contains(".mixins."))
- {
- final byte[] bytes =
PlasticInternalUtils.readBytecodeForClass(parent, name, true);
- c = defineClass(name, bytes, 0, bytes.length);
- if (resolve)
- {
- resolveClass(c);
- }
- }
- else
+ if (c != null)
+ return c;
+
+ if (name.contains(".base.") || name.contains(".pages.") ||
name.contains(".components.")
+ || name.contains(".mixins."))
+ {
+ final byte[] bytes =
PlasticInternalUtils.readBytecodeForClass(parent, name, true);
+ c = defineClass(name, bytes, 0, bytes.length);
+ if (resolve)
{
- c = parent.loadClass(name);
+ resolveClass(c);
}
}
+ else
+ {
+ c = parent.loadClass(name);
+ }
+
return c;
- }
+ }
}
- public static void main(String[] args) throws Exception
- {
-
- final String className =
"org.apache.tapestry5.corelib.components.BeanEditor";
-
- final ClassLoader parentClassLoader =
ThrowawayClassLoader.class.getClassLoader();
- ClassLoader classLoader1 = create(parentClassLoader);
- ClassLoader classLoader2 = create(parentClassLoader);
-
- System.out.println("Parent class loader 1: " + parentClassLoader);
- System.out.println("Class loader 1 : " + classLoader1);
- System.out.println("Class loader 2 : " + classLoader2);
-
- Class class1 = classLoader1.loadClass(className);
- Class class2 = classLoader2.loadClass(className);
- Class class3 = parentClassLoader.loadClass(className);
-
- System.out.println("Class 1 : " + class1.getClassLoader());
- System.out.println("Class 2 : " + class2.getClassLoader());
- System.out.println("Class 3 : " + class3.getClassLoader());
-
- assertNotEquals(class1, class2);
- assertNotEquals(class1, class3);
- assertNotEquals(class2, class3);
-
- }
-
public static Class<?> load(final String className)
{
ThrowawayClassLoader loader = new ThrowawayClassLoader(
ThrowawayClassLoader.class.getClassLoader());
- try
+ try
{
return loader.loadClass(className);
- } catch (ClassNotFoundException e)
+ }
+ catch (ClassNotFoundException e)
{
throw new RuntimeException(e);
}
}
- private static ClassLoader create(final ClassLoader parentClassLoader) {
-// return
TapestryInternalUtils.createThrowawayClassloader(parentClassLoader);
+ static ClassLoader create(final ClassLoader parentClassLoader)
+ {
return new ThrowawayClassLoader(parentClassLoader);
}
-
}
diff --git
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/ThrowawayClassLoaderTest.java
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/ThrowawayClassLoaderTest.java
new file mode 100644
index 000000000..1b1c6c135
--- /dev/null
+++
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/ThrowawayClassLoaderTest.java
@@ -0,0 +1,47 @@
+// Copyright 2025 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal;
+
+import static org.testng.Assert.assertNotEquals;
+
+import org.testng.annotations.Test;
+
+class ThrowawayClassLoaderTest
+{
+
+ @Test
+ void testClassesArenEqualFromDifferentClassloaders() throws
ClassNotFoundException
+ {
+ // ARRANGE
+
+ String className =
"org.apache.tapestry5.corelib.components.BeanEditor";
+
+ ClassLoader parentClassLoader =
ThrowawayClassLoader.class.getClassLoader();
+ ClassLoader classLoader1 =
ThrowawayClassLoader.create(parentClassLoader);
+ ClassLoader classLoader2 =
ThrowawayClassLoader.create(parentClassLoader);
+
+ // ACT
+
+ Class<?> class1 = classLoader1.loadClass(className);
+ Class<?> class2 = classLoader2.loadClass(className);
+ Class<?> class3 = parentClassLoader.loadClass(className);
+
+ // ASSERT
+
+ assertNotEquals(class1, class2);
+ assertNotEquals(class1, class3);
+ assertNotEquals(class2, class3);
+ }
+}