Thanks for the feedback.

> On Mar 11, 2016, at 8:50 AM, Paul Sandoz <paul.san...@oracle.com> wrote:
> :
> 
> sun/util/locale/provider/ResourceBundleProviderSupport.java
> —
> 
> 
>  72                 // java.base may not be able to read the bundleClass's 
> module.
>  73                 PrivilegedAction<Void> pa1 = () -> { 
> ctor.setAccessible(true); return null; };
>  74                 AccessController.doPrivileged(pa1);
>  75                 try {
>  76                     return ctor.newInstance((Object[]) null);
>  77                 } catch (InvocationTargetException e) {
>  78                     
> Unsafe.getUnsafe().throwException(e.getTargetException());
>  79                 } catch (InstantiationException | IllegalAccessException 
> e) {
>  80                     throw new InternalError(e);
>  81                 }
>  82             } catch (NoSuchMethodException e) {
>  83             }
>  84         }
>  85         return null;
>  86     }
> 
> 
> Please avoid the use of Unsafe here, use a sneaky throw instead if necessary, 
> or wrap.

I agree. It's also used from ResourceBundle.Control::newBundle. Since core 
reflection now gets readability for free, setAccessible is no longer needed 
[1]. So it can call Class::newInstance instead.  I fixed both places not to use 
Unsafe.

> 
> j.l.ClassLoader
> —
> 
> 1777         // define Package object if the named package is not yet defined
> 1778         NamedPackage p = packages.computeIfAbsent(name,
> 1779                                                   k -> 
> NamedPackage.toPackage(name, m));
> 1780         if (p instanceof Package)
> 1781             return (Package)p;
> 1782
> 1783         // otherwise, replace the NamedPackage object with Package object
> 1784         return (Package)packages.compute(name, this::toPackage);
> 
> You could merge the computeIfAbsent and compute into a single compute call if 
> you so wish.
> 
> return (Package)packages.compute((n, p) -> {
>  // define Package object if the named package is not yet defined
>  if (p == null) return NamedPackage.toPackage(name, m);
>  // otherwise, replace the NamedPackage object with Package object
>  return (p instanceof Package) ? p : toPackage(n, p);
> });
> 

Thanks for the example.  I will keep it as is.

> 
> j.l.r.Proxy
> —
> 
> 636         private static final WeakCache<Module, List<Class<?>>, Class<?>> 
> proxyCache =
> 637             new WeakCache<>(new KeyFactory<Module>(),
> 638                 new BiFunction<Module, List<Class<?>>, Class<?>>()  {
> 639                     @Override
> 640                     public Class<?> apply(Module m, List<Class<?>> 
> interfaces) {
> 641                         Objects.requireNonNull(m);
> 642                         return defineProxyClass(m, interfaces);
> 643                     }
> 644             });
> 
> Wild idea: this feels like an equivalent of j.l.i.ClassValue for Module.
> 

Feels like that.

This is the case when the proxy class is generated in a dynamic module case 
[1]. It’s a computed value  with the given list of proxy interfaces and the 
given defining class loader.

Each dynamic proxy is defined by a given class loader. The target Module where 
the proxy class may be a newly defined dynamic module per the given class 
loader.  So a given list of proxy interfaces + the defining class loader will 
map to one Module.

> 
> :
> Use Stream.flatMap e.g.
> 
>  interfaces.stream().flatMap(i -> Stream.of(i.getMethods()).
>    flatMap(m -> f(m) /*extract all types on method*/).
>    map(…).filter(…).collect(toSet())
> 
> Stream<Class<?>> f(Method m) {
>  return Stream.of(new Class[] {m.getReturnType()}, m.getParameterTypes(), 
> m.getExceptionTypes()).
>    flatMap(a -> Stream.of(a));
> }

Updated.

> 
> Consider using computeIfAbsent. At the moment no need for AtomicInteger.
> 
> 

Updated.  I probably intended to convert that when converting to AtomicInteger.

> 1055     @CallerSensitive
> 1056     public static Object newProxyInstance(ClassLoader loader,
> 1057                                           Class<?>[] interfaces,
> 1058                                           InvocationHandler h) {
> 1059         Objects.requireNonNull(h);
> 1060
> 1061         final List<Class<?>> intfs = Arrays.asList(interfaces.clone());
> 
> Use List.of, which will also clone? This presumes that there are no null 
> values in the array.

Updated.  Happy to use the new JDK 9 List.of method (the code predates 
List.of). Yes it will clone and do null check. 
> 
> sun.invoke.util.VerifyAccess
> —
> 
> 198                 while (c.isArray()) {
> 199                     c = c.getComponentType();
> 200                 }
> 
> This pattern is occurring a number of times.
> 
> Memo: add a method on Arrays, or somewhere…,
> 

+1.  Perhaps Class::getBaseElementType.

> 
> sun.util.resources.LocaleData
> —
> 
>  77     private static final Map<String, List<Locale>> candidatesMap = new 
> ConcurrentHashMap<>();
> 
> candidatesMap -> CANDIDATES_MAP
> 

Changed.

Alan has covered the rest.

Mandy

[1] 
http://mail.openjdk.java.net/pipermail/jpms-spec-experts/2016-March/000248.html
[2] 
http://download.java.net/java/jigsaw/docs/api/java/lang/reflect/Proxy.html#membership

Reply via email to