Hi guys,

Do we want to add an option to switch to a classloader based proxy
definition?

Idea is that instead of using reflection or unsafe to define our proxies we
create a class loader - likely in WebBeansContext and shared accross all
AbstractProxyFactories. It looks like (ignore the visibility, I took it
from a poc as a nested class):

private static class InternalClassLoader extends ClassLoader {
    private final ConcurrentMap<String, Class<?>> classes = new
ConcurrentHashMap<>();

    private InternalClassLoader(final ClassLoader applicationClassLoader) {
        super(applicationClassLoader);
    }


    @Override
    protected Class<?> loadClass(final String name, final boolean
resolve) throws ClassNotFoundException {
        final Class<?> clazz = classes.get(name);
        if (clazz == null) {
            return getParent().loadClass(name);
        }
        return clazz;
    }

    private Class<?> getOrRegister(final String proxyClassName, final
byte[] proxyBytes) {
        return classes.computeIfAbsent(
                proxyClassName.replace('/', '.'),
                n -> {
                    final Class<?> defined =
super.defineClass(proxyClassName, proxyBytes, 0, proxyBytes.length);
                    resolveClass(defined);
                    return defined;
                });
    }
}


Then AbstractProxyFactory would make getProxyClass behaving as - assuming
we have proxies the instance of this classloader:

return proxies;.

I suspect it can need to use that classloader instead of TCCL for
deserialization but it is not a big deal too.

The big advantage is to work on java >= 9 without warning (WARNING: Illegal
reflective access ) but it has a disavantage to not support
protected/package scope proxying (since we use 2 classloaders).

If we want to be clever we could use both strategies at the same time, i.e.
if we can proxy through this classloader then we do, otherwise we keep
current impl.

Any opinion? i'd really like to have a clean run on java 11 for 2.0.12 or
2.0.13, even if we must add a few limitations like this visibility thing.

wdyt?
Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<https://rmannibucau.metawerx.net/> | Old Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book
<https://www.packtpub.com/application-development/java-ee-8-high-performance>

Reply via email to