This is an automated email from the ASF dual-hosted git repository.
jlmonteiro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 2af6184 OWB-1392 Also abstract newInstance in the
DefiningClassService so it can be overriden
2af6184 is described below
commit 2af6184ee5ec6b474f037b3c5768c82bba136722
Author: Jean-Louis Monteiro <[email protected]>
AuthorDate: Wed Oct 6 10:11:52 2021 +0200
OWB-1392 Also abstract newInstance in the DefiningClassService so it can be
overriden
---
.../webbeans/proxy/AbstractProxyFactory.java | 18 ++++-----------
.../webbeans/service/ClassLoaderProxyService.java | 26 ++++++++++++++++++++++
.../service/ClassLoaderProxyServiceTest.java | 16 +++++++++++++
.../apache/webbeans/spi/DefiningClassService.java | 8 +++++++
4 files changed, 54 insertions(+), 14 deletions(-)
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
b/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
index 9cc9d52..040226d 100644
---
a/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
+++
b/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
@@ -336,23 +336,13 @@ public abstract class AbstractProxyFactory
return unsafe.defineAndLoadClass(classLoader, proxyClassName,
proxyBytes, classToProxy);
}
- protected <T> T newInstance(final Class<? extends T> proxyClass)
+ protected <T> T newInstance(final Class<? extends T> proxyClass)
{
- if (unsafe != null)
- {
- return unsafe.unsafeNewInstance(proxyClass);
- }
- else
+ if (definingService != null)
{
- try
- {
- return proxyClass.getConstructor().newInstance();
- }
- catch (final Exception e)
- {
- throw new IllegalStateException("Failed to allocateInstance of
Proxy class " + proxyClass.getName(), e);
- }
+ return definingService.newInstance(proxyClass);
}
+ return unsafe.unsafeNewInstance(proxyClass);
}
private Method[] sortOutDuplicateMethods(Method[] methods)
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
b/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
index aab6332..632da45 100644
---
a/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
+++
b/webbeans-impl/src/main/java/org/apache/webbeans/service/ClassLoaderProxyService.java
@@ -59,6 +59,19 @@ public class ClassLoaderProxyService implements
DefiningClassService
name, bytecode, proxiedClass.getPackage(),
proxiedClass.getProtectionDomain());
}
+ @Override
+ public <T> T newInstance(final Class<? extends T> proxyClass)
+ {
+ try
+ {
+ return proxyClass.getConstructor().newInstance();
+ }
+ catch (final Exception e)
+ {
+ throw new IllegalStateException("Failed to create a new Proxy
instance of " + proxyClass.getName(), e);
+ }
+ }
+
// for build tools - @Experimental
public static class Spy extends ClassLoaderProxyService
{
@@ -132,6 +145,19 @@ public class ClassLoaderProxyService implements
DefiningClassService
throw new WebBeansException(e);
}
}
+
+ @Override
+ public <T> T newInstance(final Class<? extends T> proxyClass)
+ {
+ try
+ {
+ return proxyClass.getConstructor().newInstance();
+ }
+ catch (final Exception e)
+ {
+ throw new IllegalStateException("Failed to create a new Proxy
instance of " + proxyClass.getName(), e);
+ }
+ }
}
private static class ProxiesClassLoader extends ClassLoader
diff --git
a/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
b/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
index 0b4f5f4..be6fcd3 100644
---
a/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
+++
b/webbeans-impl/src/test/java/org/apache/webbeans/service/ClassLoaderProxyServiceTest.java
@@ -44,13 +44,29 @@ public class ClassLoaderProxyServiceTest
final ClassLoader proxyLoader =
context.getService(DefiningClassService.class).getProxyClassLoader(proxyClass);
assertEquals(proxyLoader, proxyClass.getClassLoader());
proxyClass.getMethod("ok", String.class); // this line would fail if
not here, no assert needed
+
+ // when using ClassLoaderProxyService, we don't use Unsafe to allocate
the instance
+ // the regular reflection method newInstance is called and therefore
the constructor gets called
+ // final Bean<MyBean> bean =
+ // final MyBean beanInstance = factory.createProxyInstance(proxyClass,
factory.getInstanceProvider(proxyLoader, bean));
+ // assertTrue(beanInstance.isConstructorInvoked);
}
public static class MyBean
{
+ private final boolean constructorInvoked;
+
+ public MyBean() {
+ this.constructorInvoked = true;
+ }
+
public String ok(final String value)
{
return ">" + value + "<";
}
+
+ public boolean isConstructorInvoked() {
+ return constructorInvoked;
+ }
}
}
diff --git
a/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
b/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
index 3bda2cd..3312b01 100644
---
a/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
+++
b/webbeans-spi/src/main/java/org/apache/webbeans/spi/DefiningClassService.java
@@ -40,4 +40,12 @@ public interface DefiningClassService
* @return the proxy class
*/
<T> Class<T> defineAndLoad(String name, byte[] bytecode, Class<T>
proxiedClass);
+
+ /**
+ * Create a new instance for a given proxy class.
+ * @param proxyClass the proxy class
+ * @param <T> type of the class to proxy
+ * @return the proxy instance
+ */
+ <T> T newInstance(final Class<? extends T> proxyClass); // maybe a default
method would make sense here
}