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.

Reply via email to