Sure!

Think about having an interface and 3 producer methods. Each with different 
proxy configuration. Means 3 different bytecode optimisations for the same 
class. 
Or having an interface in an EAR and 4 WARs which have their own impls. Still 
the proxy gets generated and loaded via the shared EarClassLoader for class 
visibility reasons.

So there are scenarios where you end up with n proxies - each with different 
bytecode - for the same class.

LieGrue,
strub

> Am 11.11.2019 um 20:16 schrieb Romain Manni-Bucau <rmannibu...@gmail.com>:
> 
> @Mark: not sure what you mean and which case you have in mind. Can you
> precise your answer please and what prevents my patch to work?
> 
> Le lun. 11 nov. 2019 à 20:13, Mark Struberg <strub...@yahoo.de.invalid> a
> écrit :
> 
>> no we still need it imo
>> 
>>> Am 09.11.2019 um 16:30 schrieb Romain Manni-Bucau <rmannibu...@gmail.com
>>> :
>>> 
>>> Hi everyone,
>>> 
>>> I wonder if we can drop the loop
>>> in org.apache.webbeans.proxy.AbstractProxyFactory#getUnusedProxyClassName
>>> to ensure we have stable names for proxies.
>>> The rational behind that is to:
>>> 
>>> 1. Stop creating the same class again and again when we
>>> start/stop/restart/restop/... a container in the same classloader
>>> 2. Ensure we have deterministic names for the same proxy (currently, when
>>> the name are conflicting, it depends what was executed before, even in
>> the
>>> same app!).
>>> 
>>> From a quick review we only need to mark the intercepted methods in the
>>> proxy name to ensure we can reuse the existing class. Therefore a quick
>>> proposal for the proxy name suffix is:
>>> 
>>> +    protected String getProxySuffix(final Method[] interceptedMethods,
>>> +                                    final Method[]
>> nonInterceptedMethods) {
>>> +        return "__i_" + getMethodsId(interceptedMethods);
>>> +    }
>>> +
>>> +    private String getMethodsId(final Method[] methods, final
>>> Predicate<Method> filter) {
>>> +        return Stream.of(methods)
>>> +                .filter(filter)
>>> +                .map(m -> m.getName() +
>>> +
>>> 
>> Stream.of(m.getParameterTypes()).map(Class::getSimpleName).collect(joining()))
>>> +                .collect(joining("_"));
>>> +    }
>>> 
>>> Full patch is available here:
>>> https://gist.github.com/rmannibucau/6f6cdf8d605387ac8820dcbc76e67909
>>> 
>>> Wdyt?
>>> 
>>> If not desired, should I
>>> enrich org.apache.webbeans.spi.DefiningClassService with that feature?
>>> 
>>> 
>>> 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