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
 }

Reply via email to