Reflection usage in LazyPainter class

Alexander Scherbatiy alexander.scherbatiy at bell-sw.com
Wed Sep 15 08:21:39 UTC 2021


Hello,

LazyPainter class from Defaults.template uses reflection to create a 
Painter classes [1].

There are some fixes which replace LazyValue with lambdas [2], [3]:
   8039750: KSS: Replace MetalLazyValue with lambda
   8035313: Change SwingLazyValue usage to lambda

Would it be useful to get rid of reflection in LazyPainter as well?

It looks like LazyPainter can't be directly converted to Lambda.
It stores PaintContext during createValue(...) calls.
And it can use a custom class loader which it gets from UIDefaults by 
"ClassLoader" key.

May be LazyPainter can check if a class loader from UIDefaults is null 
and create a Painter class directly
in this case just mapping a class string to corresponding object 
creation code like:

     private static AbstractRegionPainter createPainter(
             String className, AbstractRegionPainter.PaintContext ctx, 
int which) {
         switch (className) {
             case "javax.swing.plaf.nimbus.ScrollPanePainter":
                 return new 
javax.swing.plaf.nimbus.ScrollPanePainter(ctx, which);
             case "javax.swing.plaf.nimbus.InternalFramePainter":
                 return new 
javax.swing.plaf.nimbus.InternalFramePainter(ctx, which);
             ...
         }
     }

[1] 
https://github.com/openjdk/jdk/blob/febcc72a549e973de4649503fc686fc520e3b3cd/src/java.desktop/share/classes/javax/swing/plaf/nimbus/Defaults.template#L414
[2] 
https://github.com/openjdk/jdk/commit/717bcde5f3596b695100de468c352617625c17cc
[3] 
https://github.com/openjdk/jdk/commit/c8ad756ad83c7af296ce2b621be12ed7a9d23f6e

Thanks,
Alexander.




More information about the client-libs-dev mailing list