diff --git a/container-api/src/main/java/org/jboss/forge/furnace/versions/ComparableVersion.java b/container-api/src/main/java/org/jboss/forge/furnace/versions/ComparableVersion.java index adc66137..38b8bc0f 100644 --- a/container-api/src/main/java/org/jboss/forge/furnace/versions/ComparableVersion.java +++ b/container-api/src/main/java/org/jboss/forge/furnace/versions/ComparableVersion.java @@ -363,11 +363,11 @@ public final void parseVersion(String version) { this.value = version; - items = new ListItem(); + setItems(new ListItem()); version = version.toLowerCase(Locale.ENGLISH); - ListItem list = items; + ListItem list = getItems(); Stack stack = new Stack(); stack.push(list); @@ -451,7 +451,7 @@ else if (Character.isDigit(c)) list.normalize(); } - canonical = items.toString(); + canonical = getItems().toString(); } private static Item parseItem(boolean isDigit, String buf) @@ -462,7 +462,7 @@ private static Item parseItem(boolean isDigit, String buf) @Override public int compareTo(ComparableVersion o) { - return items.compareTo(o.items); + return getItems().compareTo(o.getItems()); } @Override @@ -482,4 +482,14 @@ public int hashCode() { return canonical.hashCode(); } + + private ListItem getItems() + { + return items; + } + + private void setItems(ListItem items) + { + this.items = items; + } } diff --git a/container-api/src/main/java/org/jboss/forge/furnace/versions/SingleVersion.java b/container-api/src/main/java/org/jboss/forge/furnace/versions/SingleVersion.java index 7c949b55..24480936 100644 --- a/container-api/src/main/java/org/jboss/forge/furnace/versions/SingleVersion.java +++ b/container-api/src/main/java/org/jboss/forge/furnace/versions/SingleVersion.java @@ -50,7 +50,7 @@ public SingleVersion(String version) @Override public int hashCode() { - return 11 + comparable.hashCode(); + return 11 + getComparable().hashCode(); } @Override @@ -77,7 +77,7 @@ public int compareTo(Version otherVersion) if (otherVersion instanceof SingleVersion) { - return this.comparable.compareTo(((SingleVersion) otherVersion).comparable); + return this.getComparable().compareTo(((SingleVersion) otherVersion).getComparable()); } else { @@ -115,10 +115,10 @@ public String getQualifier() return qualifier; } - public final void parseVersion(String version) + private final void parseVersion(String version) { Assert.notNull(version, "Version must not be null."); - comparable = new ComparableVersion(version); + setComparable(new ComparableVersion(version)); int index = version.indexOf("-"); @@ -254,4 +254,14 @@ else if (qualifier != null) } return buf.toString(); } + + public ComparableVersion getComparable() + { + return comparable; + } + + private void setComparable(ComparableVersion comparable) + { + this.comparable = comparable; + } } diff --git a/container-tests/src/test/java/test/org/jboss/forge/furnace/lifecycle/RecordingEventManager.java b/container-tests/src/test/java/test/org/jboss/forge/furnace/lifecycle/RecordingEventManager.java index b5187ddb..843d2d58 100644 --- a/container-tests/src/test/java/test/org/jboss/forge/furnace/lifecycle/RecordingEventManager.java +++ b/container-tests/src/test/java/test/org/jboss/forge/furnace/lifecycle/RecordingEventManager.java @@ -20,8 +20,8 @@ */ public class RecordingEventManager implements EventManager { - private static List events = new ArrayList(); - private static List qualifiers = new ArrayList(); + private static List events = new ArrayList<>(); + private static List qualifiers = new ArrayList<>(); private static int postStartupCount; private static int preShutdownCount; diff --git a/container/src/main/java/org/jboss/forge/furnace/impl/modules/providers/FurnaceContainerSpec.java b/container/src/main/java/org/jboss/forge/furnace/impl/modules/providers/FurnaceContainerSpec.java index d4f4db82..6b922f0d 100644 --- a/container/src/main/java/org/jboss/forge/furnace/impl/modules/providers/FurnaceContainerSpec.java +++ b/container/src/main/java/org/jboss/forge/furnace/impl/modules/providers/FurnaceContainerSpec.java @@ -18,6 +18,7 @@ public class FurnaceContainerSpec extends AbstractModuleSpecProvider static { + paths.add("org/jboss/forge/furnace/proxy"); paths.add("org/jboss/forge/furnace/proxy/javassist"); paths.add("org/jboss/forge/furnace/proxy/javassist/bytecode"); paths.add("org/jboss/forge/furnace/proxy/javassist/bytecode/analysis"); @@ -36,6 +37,16 @@ public class FurnaceContainerSpec extends AbstractModuleSpecProvider paths.add("org/jboss/forge/furnace/proxy/javassist/util"); paths.add("org/jboss/forge/furnace/proxy/javassist/util/proxy"); + paths.add("org/jboss/forge/furnace/proxy/objenesis"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator/android"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator/basic"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator/gcj"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator/jrockit"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator/perc"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/instantiator/sun"); + paths.add("org/jboss/forge/furnace/proxy/objenesis/strategy"); + paths.add("org/jboss/forge/furnace"); paths.add("org/jboss/forge/furnace/addons"); paths.add("org/jboss/forge/furnace/event"); @@ -48,7 +59,6 @@ public class FurnaceContainerSpec extends AbstractModuleSpecProvider paths.add("org/jboss/forge/furnace/util"); paths.add("org/jboss/forge/furnace/versions"); - paths.add("org/jboss/forge/furnace/proxy"); } @Override @@ -62,8 +72,6 @@ protected void configure(ModuleLoader loader, Builder builder) PathFilters.isChildOf("org/jboss/forge/furnace/impl"))), PathFilters.any(Arrays.asList( - PathFilters.is("org/jboss/forge/furnace/proxy/javassist"), - PathFilters.isChildOf("org/jboss/forge/furnace/proxy/javassist"), PathFilters.is("META-INF/services"), PathFilters.is("org/jboss/forge/furnace"), PathFilters.is("org/jboss/forge/furnace/addons"), @@ -76,7 +84,11 @@ protected void configure(ModuleLoader loader, Builder builder) PathFilters.is("org/jboss/forge/furnace/spi"), PathFilters.is("org/jboss/forge/furnace/util"), PathFilters.is("org/jboss/forge/furnace/versions"), - PathFilters.is("org/jboss/forge/furnace/proxy") + PathFilters.is("org/jboss/forge/furnace/proxy"), + PathFilters.is("org/jboss/forge/furnace/proxy/javassist"), + PathFilters.isChildOf("org/jboss/forge/furnace/proxy/javassist"), + PathFilters.is("org/jboss/forge/furnace/proxy/objenesis"), + PathFilters.isChildOf("org/jboss/forge/furnace/proxy/objenesis") ))), getPaths())); } diff --git a/pom.xml b/pom.xml index 9831cdfa..38844f1b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 @@ -137,6 +138,11 @@ jgrapht 0.8.3 + + org.objenesis + objenesis + 2.1 + @@ -307,7 +313,7 @@ - + @@ -324,7 +330,7 @@ - + @@ -341,7 +347,7 @@ - + @@ -360,7 +366,7 @@ - + diff --git a/proxy-tests/src/main/java/org/jboss/forge/furnace/proxy/constructor/PrivateConstructorObject.java b/proxy-tests/src/main/java/org/jboss/forge/furnace/proxy/constructor/PrivateConstructorObject.java new file mode 100644 index 00000000..3718ab66 --- /dev/null +++ b/proxy-tests/src/main/java/org/jboss/forge/furnace/proxy/constructor/PrivateConstructorObject.java @@ -0,0 +1,23 @@ +/* + * Copyright 2014 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.jboss.forge.furnace.proxy.constructor; + +/** + * @author Lincoln Baxter, III + */ +public class PrivateConstructorObject +{ + private PrivateConstructorObject() + { + throw new UnsupportedOperationException("DON'T CALL ME!"); + } + + public String lowercase(String value) + { + return value.toLowerCase(); + } +} diff --git a/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/classloader/ClassLoaderAdapterJavaIOSubclassTest.java b/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/classloader/ClassLoaderAdapterJavaIOSubclassTest.java index c37725fe..113068ee 100644 --- a/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/classloader/ClassLoaderAdapterJavaIOSubclassTest.java +++ b/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/classloader/ClassLoaderAdapterJavaIOSubclassTest.java @@ -85,14 +85,7 @@ public void testSubclassedPrintStream() throws Exception file.deleteOnExit(); enhancedFactory.usePrintStream(new CustomPrintStream(file)); - try - { - @SuppressWarnings("unused") - CustomPrintStream customResult = enhancedFactory.getCustomPrintStream(); - Assert.fail("Should have received a classcast exception"); - } - catch (ClassCastException e) - { - } + CustomPrintStream customResult = enhancedFactory.getCustomPrintStream(); + Assert.assertTrue(Proxies.isForgeProxy(customResult)); } } diff --git a/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/constructor/PrivateConstructorProxyTest.java b/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/constructor/PrivateConstructorProxyTest.java new file mode 100644 index 00000000..01168c0c --- /dev/null +++ b/proxy-tests/src/test/java/org/jboss/forge/furnace/proxy/constructor/PrivateConstructorProxyTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.proxy.constructor; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.forge.arquillian.archive.ForgeArchive; +import org.jboss.forge.arquillian.services.LocalServices; +import org.jboss.forge.furnace.addons.AddonRegistry; +import org.jboss.forge.furnace.proxy.Proxies; +import org.jboss.forge.furnace.repositories.AddonDependencyEntry; +import org.jboss.forge.furnace.services.Imported; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(Arquillian.class) +public class PrivateConstructorProxyTest +{ + @Deployment(order = 1) + public static ForgeArchive getDeployment() + { + ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class) + .addAsLocalServices(PrivateConstructorProxyTest.class) + .addAsAddonDependencies(AddonDependencyEntry.create("dep")); + + return archive; + } + + @Deployment(name = "dep,1", testable = false, order = 0) + public static ForgeArchive getDeploymentDep1() + { + ForgeArchive archive = ShrinkWrap.create(ForgeArchive.class) + .addClasses(PrivateConstructorObject.class) + .addAsLocalServices(PrivateConstructorObject.class) + .addBeansXML(); + + return archive; + } + + @Test + public void testPrivateConstructorProxyCanBeInstantiated() throws Exception + { + AddonRegistry registry = LocalServices.getFurnace(getClass().getClassLoader()) + .getAddonRegistry(); + + Imported imported = registry.getServices(PrivateConstructorObject.class); + PrivateConstructorObject c = imported.get(); + Assert.assertNotNull(c); + Assert.assertEquals("value", c.lowercase("VALUE")); + Assert.assertTrue(Proxies.isForgeProxy(c)); + } +} diff --git a/proxy/pom.xml b/proxy/pom.xml index e5e869ff..1972392f 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -3,7 +3,8 @@ - + 4.0.0 @@ -26,5 +27,39 @@ org.jboss.forge forge-javassist + + org.objenesis + objenesis + + + + + + maven-shade-plugin + + + package + + shade + + + + + true + + + org.objenesis:objenesis + + + + + org.objenesis + org.jboss.forge.furnace.proxy.objenesis + + + + + + diff --git a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderAdapterCallback.java b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderAdapterCallback.java index 72b29231..032ab5e8 100644 --- a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderAdapterCallback.java +++ b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderAdapterCallback.java @@ -68,11 +68,11 @@ public ClassLoaderAdapterCallback(Callable> whitelist, ClassLoa public Object invoke(final Object obj, final Method thisMethod, final Method proceed, final Object[] args) throws Throwable { - if(Thread.currentThread().isInterrupted()) + if (Thread.currentThread().isInterrupted()) { throw new ContainerException("Thread.interrupt() requested."); } - + return ClassLoaders.executeIn(delegateLoader, new Callable() { @Override @@ -331,8 +331,23 @@ private Exception enhanceException(final Method method, final Exception exceptio { result = enhance(whitelist, getCallingLoader(), exceptionLoader, method, exception, exceptionHierarchy); - result.initCause(exception); - result.setStackTrace(exception.getStackTrace()); + try + { + result.initCause(exception); + } + catch (Exception e) + { + // oh welll + } + + try + { + result.setStackTrace(exception.getStackTrace()); + } + catch (Exception e) + { + // oh well + } } } } @@ -342,7 +357,7 @@ private Exception enhanceException(final Method method, final Exception exceptio log.log(Level.WARNING, "Could not enhance exception for passing through ClassLoader boundary. Exception type [" + exception.getClass().getName() + "], Caller [" + getCallingLoader() + "], Delegate [" - + delegateLoader + "]"); + + delegateLoader + "]", e); return exception; } return result; @@ -738,15 +753,7 @@ public T call() throws Exception @Override public boolean isHandled(Method method) { - if (!method.getDeclaringClass().getName().contains("java.lang") - || !Proxies.isPassthroughType(method.getDeclaringClass()) - || ("toString".equals(method.getName()) && method.getParameterTypes().length == 0) - || isEquals(method) - || isHashCode(method) - || isAutoCloseableClose(method) - || Arrays.contains(types, method.getDeclaringClass())) - return true; - return false; + return true; } }; @@ -786,8 +793,8 @@ protected ClassLoader getClassLoader0() f.setInterfaces(hierarchy); f.setFilter(filter); - final Class c = f.createClass(); - enhancedResult = c.newInstance(); + final Class proxyType = f.createClass(); + enhancedResult = Proxies.instantiate(proxyType); try { diff --git a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderInterceptor.java b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderInterceptor.java index 0aa08bcf..df0649ea 100644 --- a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderInterceptor.java +++ b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ClassLoaderInterceptor.java @@ -70,6 +70,11 @@ public Object call() throws Exception throw (Exception) e.getCause(); throw e; } + catch (IllegalArgumentException e) { + System.out.println(thisMethod.getDeclaringClass()); + System.out.println(delegate.getClass()); + throw e; + } finally { setCurrentLoader(previousLoader); diff --git a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ForgeProxyMethodFilter.java b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ForgeProxyMethodFilter.java index 453eba75..bdda89ae 100644 --- a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ForgeProxyMethodFilter.java +++ b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ForgeProxyMethodFilter.java @@ -19,15 +19,6 @@ class ForgeProxyMethodFilter implements MethodFilter @Override public boolean isHandled(Method method) { - String name = method.getName(); - Class[] parameterTypes = method.getParameterTypes(); - if (!method.getDeclaringClass().getName().contains("java.lang") - || ("clone".equals(name) && parameterTypes.length == 0) - || ("close".equals(name) && parameterTypes.length == 0) - || ("equals".equals(name) && parameterTypes.length == 1) - || ("hashCode".equals(name) && parameterTypes.length == 0) - || ("toString".equals(name) && parameterTypes.length == 0)) - return true; - return false; + return true; } } \ No newline at end of file diff --git a/proxy/src/main/java/org/jboss/forge/furnace/proxy/Proxies.java b/proxy/src/main/java/org/jboss/forge/furnace/proxy/Proxies.java index e4d77fd7..0247ed8d 100644 --- a/proxy/src/main/java/org/jboss/forge/furnace/proxy/Proxies.java +++ b/proxy/src/main/java/org/jboss/forge/furnace/proxy/Proxies.java @@ -16,6 +16,8 @@ import org.jboss.forge.furnace.proxy.javassist.util.proxy.Proxy; import org.jboss.forge.furnace.proxy.javassist.util.proxy.ProxyFactory; import org.jboss.forge.furnace.proxy.javassist.util.proxy.ProxyObject; +import org.objenesis.ObjenesisHelper; +import org.objenesis.ObjenesisStd; /** * @author Lincoln Baxter, III @@ -82,21 +84,7 @@ protected ClassLoader getClassLoader() setCachedProxyType(loader, type, proxyType); } - try - { - result = proxyType.newInstance(); - } - catch (InstantiationException e) - { - throw new IllegalStateException( - "Could not instantiate proxy for object [" + instance + "] of type [" + type - + "]. For optimal proxy compatibility, ensure " + - "that this type is an interface, or a class with a default constructor.", e); - } - catch (IllegalAccessException e) - { - throw new IllegalStateException(e); - } + result = instantiate(proxyType); if (result instanceof Proxy) ((Proxy) result).setHandler(handler); @@ -109,6 +97,22 @@ else if (result instanceof ProxyObject) return (T) result; } + /** + * Attempt to instantiate the given {@link Class} type without calling its constructor. + */ + public static T instantiate(Class type) + { + try + { + if (isInstantiable(type)) + return type.newInstance(); + } + catch (Exception e) + { + } + return new ObjenesisStd(false).newInstance(type); + } + private static Class getCachedProxyType(ClassLoader loader, Class type) { Class proxyType = null; @@ -174,21 +178,7 @@ else if (type.isInterface()) setCachedProxyType(type.getClassLoader(), type, proxyType); } - try - { - result = proxyType.newInstance(); - } - catch (InstantiationException e) - { - throw new IllegalStateException( - "Could not instantiate proxy for type [" + type - + "]. For optimal proxy compatibility, ensure " + - "that this type is an interface, or a class with a default constructor.", e); - } - catch (IllegalAccessException e) - { - throw new IllegalStateException(e); - } + result = ObjenesisHelper.newInstance(proxyType); if (result instanceof Proxy) ((Proxy) result).setHandler(handler); @@ -411,7 +401,10 @@ public static boolean isInstantiable(Class type) { if (type.isInterface()) return true; - type.getConstructor(); + + if (isLanguageType(type)) + type.getConstructor(); + return true; } catch (SecurityException e) diff --git a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ProxyTypeInspector.java b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ProxyTypeInspector.java index acf29249..8a7bec9d 100644 --- a/proxy/src/main/java/org/jboss/forge/furnace/proxy/ProxyTypeInspector.java +++ b/proxy/src/main/java/org/jboss/forge/furnace/proxy/ProxyTypeInspector.java @@ -19,7 +19,7 @@ class ProxyTypeInspector { public static Class[] getCompatibleClassHierarchy(ClassLoader loader, Class origin) { - Set> hierarchy = new LinkedHashSet>(); + Set> hierarchy = new LinkedHashSet<>(); Class baseClass = origin; diff --git a/proxy/src/test/java/org/jboss/forge/furnace/proxy/ProxyTypeInspectorTest.java b/proxy/src/test/java/org/jboss/forge/furnace/proxy/ProxyTypeInspectorTest.java index d76150dc..160370a6 100644 --- a/proxy/src/test/java/org/jboss/forge/furnace/proxy/ProxyTypeInspectorTest.java +++ b/proxy/src/test/java/org/jboss/forge/furnace/proxy/ProxyTypeInspectorTest.java @@ -23,7 +23,7 @@ public void testClassWithInstantiableBaseClass() throws Exception Class[] hierarchy = ProxyTypeInspector.getCompatibleClassHierarchy(getClass().getClassLoader(), MockExtendsImplementsExternal.class); - Assert.assertEquals(MockBaseClassExternal.class, hierarchy[0]); + Assert.assertEquals(MockExtendsImplementsExternal.class, hierarchy[0]); Assert.assertEquals(MockInterface.class, hierarchy[1]); Assert.assertEquals(MockNestedInterface.class, hierarchy[2]); } @@ -34,8 +34,9 @@ public void testInnerClassWithNonInstantiableBaseClass() throws Exception Class[] hierarchy = ProxyTypeInspector.getCompatibleClassHierarchy(getClass().getClassLoader(), MockExtendsImplementsInternal.class); - Assert.assertEquals(MockInterface.class, hierarchy[0]); - Assert.assertEquals(MockNestedInterface.class, hierarchy[1]); + Assert.assertEquals(MockExtendsImplementsInternal.class, hierarchy[0]); + Assert.assertEquals(MockInterface.class, hierarchy[1]); + Assert.assertEquals(MockNestedInterface.class, hierarchy[2]); } private class MockExtendsImplementsInternal extends MockBaseClass implements MockInterface diff --git a/proxy/src/test/java/org/jboss/forge/furnace/proxy/test/ProxiesTest.java b/proxy/src/test/java/org/jboss/forge/furnace/proxy/test/ProxiesTest.java index 4a8b5956..190df534 100644 --- a/proxy/src/test/java/org/jboss/forge/furnace/proxy/test/ProxiesTest.java +++ b/proxy/src/test/java/org/jboss/forge/furnace/proxy/test/ProxiesTest.java @@ -56,12 +56,37 @@ public void testNestedProxy() throws Exception Proxies.enhance(object.getClass(), handler); } - @Test(expected = Exception.class) - public void testCannotProxyMemberClass() throws Exception + public void testProxyMemberClass() throws Exception { Proxies.enhance(MemberClass.class, handler); } + public class PrivateConstructor + { + private PrivateConstructor() + { + throw new IllegalStateException("Can't call me!"); + } + } + + @Test + public void testPrivateConstructorProxy() throws Exception + { + Object object = Proxies.enhance(PrivateConstructor.class, handler); + Assert.assertTrue(Proxies.isForgeProxy(object)); + } + + public final class FinalType + { + } + + @Test(expected = RuntimeException.class) + public void testFinalTypeProxy() throws Exception + { + Object object = Proxies.enhance(FinalType.class, handler); + Assert.assertTrue(Proxies.isForgeProxy(object)); + } + @Test public void testUnwrapProxyTypes() { @@ -181,7 +206,7 @@ public Object getHandler() throws Exception @Test public void testIsInstantiable() throws Exception { - Assert.assertFalse(Proxies.isInstantiable(TypeWithNonDefaultConstructor.class)); + Assert.assertTrue(Proxies.isInstantiable(TypeWithNonDefaultConstructor.class)); Assert.assertTrue(Proxies.isInstantiable(Bean.class)); } diff --git a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/services/ReflectionExportedInstance.java b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/services/ReflectionExportedInstance.java index 6981ef05..5b1d1b00 100644 --- a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/services/ReflectionExportedInstance.java +++ b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/services/ReflectionExportedInstance.java @@ -7,7 +7,6 @@ package org.jboss.forge.arquillian.services; import org.jboss.forge.furnace.addons.Addon; -import org.jboss.forge.furnace.exception.ContainerException; import org.jboss.forge.furnace.proxy.ClassLoaderInterceptor; import org.jboss.forge.furnace.proxy.Proxies; import org.jboss.forge.furnace.spi.ExportedInstance; @@ -30,17 +29,10 @@ public ReflectionExportedInstance(Addon addon, Class clazz) @Override public T get() { - try - { - T delegate = type.newInstance(); - delegate = Proxies.enhance(addon.getClassLoader(), delegate, new ClassLoaderInterceptor( - addon.getClassLoader(), delegate)); - return delegate; - } - catch (Exception e) - { - throw new ContainerException("Could not create instance of [" + type.getName() + "] through reflection.", e); - } + T delegate = Proxies.instantiate(type); + delegate = Proxies.enhance(addon.getClassLoader(), delegate, new ClassLoaderInterceptor( + addon.getClassLoader(), delegate)); + return delegate; } @Override