ã¯ããã«
éçºããã»ã¹ã§ã¯ãå€ãã®å ŽåãXMLæ§æãã¡ã€ã«ã«ååãæ ŒçŽãããŠããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããååãã¢ãããŒã·ã§ã³å±æ§ã®å€ãšããŠæååãšããŠæžã蟌ãŸããŠããã¡ãœãããåŒã³åºãå¿
èŠããããŸãã ãã®ãããªå Žåãçãã¯ããªãã¬ã¯ã·ã§ã³ã䜿çšããŠãã ããïŒãã§ãã
CUBAãã©ãããã©ãŒã ã®æ°ããããŒãžã§ã³ã§ã¯ããã¬ãŒã ã¯ãŒã¯ãæ¹åããããã®ã¿ã¹ã¯ã®1ã€ã¯ãUIç»é¢ã®ã³ã³ãããŒã©ãŒã¯ã©ã¹ã§ã®ã€ãã³ããã³ãã©ãŒã®æ瀺çãªäœæãåãé€ãããšã§ããã 以åã®ããŒãžã§ã³ã§ã¯ãã³ã³ãããŒã©ãŒã®åæåã¡ãœããã§ã®ãã³ãã©ãŒå®£èšã¯ã³ãŒãã§éåžžã«ä¹±éã ã£ãããã7çªç®ã®ããŒãžã§ã³ã§ã¯ãã¹ãŠãå®å šã«åé€ããããšãæåºãšããŠæ±ºå®ããŸããã
ã€ãã³ããªã¹ããŒã¯ãé©åãªã¿ã€ãã³ã°ã§åŒã³åºãå¿
èŠãããã¡ãœãããžã®åãªãåç
§ã§ãïŒ Observerãã³ãã¬ãŒããåç
§ïŒã ãã®ãããªãã³ãã¬ãŒãã¯ã java.lang.reflect.Method
ã¯ã©ã¹ã䜿çšããŠå®è£
ããã®ãéåžžã«ç°¡åã§ãã éå§æã«ã¯ããã¬ãŒã ã¯ãŒã¯ã®å€§éšåã§è¡ãããŠããããã«ãã¯ã©ã¹ãã¹ãã£ã³ããããããã泚éä»ãã¡ãœãããæœåºããããããžã®åç
§ãä¿åããã€ãã³ããçºçãããšãã«ãªã³ã¯ã䜿çšããŠã¡ãœãããåŒã³åºããŸãã ç§ãã¡ãæ¢ããå¯äžã®ããšã¯ãå€ãã®ã€ãã³ããäŒçµ±çã«UIã§çæãããããšã§ããããªãã¬ã¯ã·ã§ã³APIã䜿çšããå Žåãã¡ãœããåŒã³åºãã®æéã®åœ¢ã§ããããã®äŸ¡æ Œãæ¯æãå¿
èŠããããŸãã ãããã£ãŠããªãã¬ã¯ã·ã§ã³ã䜿çšããã«ã€ãã³ããã³ãã©ãŒãäœæããæ¹æ³ãæ€èšããããšã«ããŸããã
æ¢ã«MethodHandlesãšLambdaMetafactoryã«é¢ããè³æãhabrã§å ¬éããŠãã ããã®è³æã¯äžçš®ã®ç¶ç¶ã§ãã ãªãã¬ã¯ã·ã§ã³APIã®é·æãšçæãããã³ä»£æ¿æ¡ïŒAOTã³ã³ãã€ã«ãšLambdaMetafactoryã䜿çšããã³ãŒãã®çæãCUBAãã¬ãŒã ã¯ãŒã¯ã§ã®äœ¿çšæ¹æ³ïŒã調ã¹ãŸãã
ãªãã¬ã¯ã·ã§ã³ïŒå€ãã ããã ä¿¡é Œã§ãã
ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã§ã¯ããªãã¬ã¯ã·ã§ã³ãŸãã¯ãªãã¬ã¯ã·ã§ã³ïŒã€ã³ããã¹ãã¯ã·ã§ã³ã®ç¥èªãè±èªã®ãªãã¬ã¯ã·ã§ã³ïŒã¯ãå®è¡æã«ããã°ã©ã ãç¬èªã®æ§é ãšåäœã远跡ããã³å€æŽã§ããããã»ã¹ãæå³ããŸãã ïŒcïŒãŠã£ãããã£ã¢ã
ã»ãšãã©ã®Javaéçºè ã«ãšã£ãŠããªãã¬ã¯ã·ã§ã³ã¯æ±ºããŠæ°ãããã®ã§ã¯ãããŸããã ãã®ã¡ã«ããºã ããªããã°ãJavaã¯ã¢ããªã±ãŒã·ã§ã³ãœãããŠã§ã¢éçºã§å€§ããªåžå Žã·ã§ã¢ãå ããJavaã«ã¯ãªããªãã£ãããã«æããŸãã èããŠã¿ãŠãã ããïŒãããã·ãã¢ãããŒã·ã§ã³ãä»ããã¡ãœããã®ã€ãã³ããžã®ãã€ã³ããäŸåé¢ä¿ã®æ³šå ¥ãã¢ã¹ãã¯ãããããŠJDKã®æåã®ããŒãžã§ã³ã§ã®JDBCãã©ã€ããŒã®ã€ã³ã¹ã¿ã³ã¹åããïŒ ã©ãã§ããªãã¬ã¯ã·ã§ã³ã¯ãçŸä»£ã®ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã®åºç€ã§ãã
ã¿ã¹ã¯ã«é©çšãããReflectionã«åé¡ã¯ãããŸããïŒ æ¬¡ã®3ã€ãç¹å®ããŸããã
é床 -Reflection APIãä»ããã¡ãœããã®åŒã³åºãã¯ãçŽæ¥åŒã³åºããããé ããªããŸãã JVMã®åæ°ããŒãžã§ã³ã§ã¯ãéçºè ã¯ãªãã¬ã¯ã·ã§ã³ãä»ããŠåŒã³åºãã絶ããã¹ããŒãã¢ããããJITã³ã³ãã€ã©ãŒã¯ã³ãŒããããã«æé©åããããšããŸããããšã«ãããçŽæ¥ã¡ãœããåŒã³åºããšã®éãã¯é¡èã§ãã
å
¥å -ã³ãŒãã§java.lang.reflect.Method
ã䜿çšããå Žåãããã¯ã¡ãœãããžã®åãªãåç
§ã§ãã ãŸããæž¡ããããã©ã¡ãŒã¿ã®æ°ãšã¿ã€ãã¯ã©ãã«ãæžãããŠããŸããã 誀ã£ããã©ã¡ãŒã¿ãŒã䜿çšããåŒã³åºãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã€ã«ãŸãã¯ããŠã³ããŒãã®æ®µéã§ã¯ãªããå®è¡æã«ãšã©ãŒãçæããŸãã
éææ§ -ãªãã¬ã¯ã·ã§ã³ãä»ããŠåŒã³åºãããã¡ãœããã倱æããå Žåããšã©ãŒã®å®éã®åå ã®åºã«å°éããåã«ãããã€ãã®invoke()
ã³ãŒã«ãåŠçããå¿
èŠããããŸãã
ããããHibernateã§SpringãŸãã¯JPAã€ãã³ããã³ãã©ãŒã®ã³ãŒãã調ã¹ããšãå
éšã«ã¯å€ãããããjava.lang.reflect.Method
ãããŸãã ãããŠãè¿ãå°æ¥ããããå€ããããšã¯ãŸããªããšæããŸãã ãããã®ãã¬ãŒã ã¯ãŒã¯ã¯å€§ãããããããã«çµã³ä»ããããããŠããããµãŒããŒåŽã®ã€ãã³ããã³ãã©ãŒã®ããã©ãŒãã³ã¹ã¯ãã©ã®åŒã³åºãããªãã¬ã¯ã·ã§ã³ã«çœ®ãæããããšãã§ããããèããã®ã«ååã§ããããã§ãã
ãããŠãä»ã«ã©ããªãªãã·ã§ã³ããããŸããïŒ
AOTã®ã³ã³ãã€ã«ãšã³ãŒãçæ-ã¢ããªã±ãŒã·ã§ã³ã«é床ãæ»ããŸãïŒ
ãªãã¬ã¯ã·ã§ã³APIã眮ãæããæåã®åè£ã¯ã³ãŒãçæã§ãã çŸåšã MicronautãQuarkusãªã©ã®ãã¬ãŒã ã¯ãŒã¯ãç»å Žãå§ããŠãããã¢ããªã±ãŒã·ã§ã³ã®èµ·åé床ã®äœäžãšã¡ã¢ãªæ¶è²»ã®åæžãšãã2ã€ã®åé¡ã解決ããããšããŠããŸãã ããã2ã€ã®ã¡ããªãã¯ã¯ãã³ã³ããããã€ã¯ããµãŒãã¹ããµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ã®æ代ã«äžå¯æ¬ ã§ãããæ°ãããã¬ãŒã ã¯ãŒã¯ã¯AOTã³ã³ãã€ã«ã«ãã£ãŠããã解決ããããšããŠããŸãã ããŸããŸãªææ³ã䜿çšããŠïŒããšãã°ã ããã§èªãããšãã§ããŸãïŒãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ãã¡ãœãããã³ã³ã¹ãã©ã¯ã¿ãŒãªã©ãžã®ãã¹ãŠã®ååž°åŒã³åºããè¡ãããããã«å€æŽãããŸãã çŽæ¥åŒã³åºãã«çœ®ãæããããŸããã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ã¯ã©ã¹ãã¹ãã£ã³ããŠBeanãäœæããå¿ èŠã¯ãªããJITã¯å®è¡æã«ã³ãŒããããå¹ççã«æé©åããŸããããã«ããããã®ãããªãã¬ãŒã ã¯ãŒã¯äžã«æ§ç¯ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã ãã®ã¢ãããŒãã«ã¯æ¬ ç¹ããããŸããïŒ åçïŒãã¡ãããããŸãã
æåã«ãäœæããã³ãŒããå®è¡ããŸããããœãŒã¹ã³ãŒãã¯ã³ã³ãã€ã«äžã«å€æŽããããããäœãåé¡ãçºçããå Žåãã³ãŒããŸãã¯çæã¢ã«ãŽãªãºã ïŒéåžžã¯ãã¡ããïŒã§ãšã©ãŒã®å Žæãç解ããããšãå°é£ãªå ŽåããããŸãïŒ ãããŠããããããããã°ã®åé¡ãçºçããŸã-ç¬èªã®ã³ãŒãããããã°ããå¿ èŠããããŸãã
2çªç®-AOTã³ã³ãã€ã«ã䜿çšããŠãã¬ãŒã ã¯ãŒã¯ã§èšè¿°ãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã«ã¯ãç¹å¥ãªããŒã«ãå¿ èŠã§ãã ããšãã°ãQuarkusã§æžãããã¢ããªã±ãŒã·ã§ã³ããã®ãŸãŸå®è¡ããããšã¯ã§ããŸããã ã³ãŒããååŠçããmaven / gradleçšã®ç¹å¥ãªãã©ã°ã€ã³ãå¿ èŠã§ãã ãããŠä»ããã¬ãŒã ã¯ãŒã¯ã§ãšã©ãŒãçºçããå Žåãã©ã€ãã©ãªã ãã§ãªããã©ã°ã€ã³ãæŽæ°ããå¿ èŠããããŸãã
å®éãJavaã®äžçã§ã¯ã³ãŒãçæãæ°ãããã®ã§ã¯ãªãã MicronautãQuarkusã§ã¯çºçããŸããã§ãã ã äœããã®åœ¢ã§ãããã€ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ããã䜿çšããŸãã ããã§ã¯ãã¢ã¹ãã¯ããŸãã¯eclipselinkã®äºåçãªã³ãŒãçæã§ããlombokãaspectjãæãåºãããšãã§ããŸããããã«ããããšã³ãã£ãã£ã¯ã©ã¹ã«ã³ãŒããè¿œå ãããããå¹ççãªéã·ãªã¢ã«åãè¡ãããŸãã CUBAã§ã¯ãã³ãŒãçæã䜿çšããŠããšã³ãã£ãã£ã®ç¶æ ã®å€åã«é¢ããã€ãã³ããçæããã¯ã©ã¹ã³ãŒãã«æ€èšŒã¡ãã»ãŒãžãå«ããŠãUIã§ã®ãšã³ãã£ãã£ã®æäœãç°¡çŽ åããŸãã
CUBAéçºè ã«ãšã£ãŠãã€ãã³ããã³ãã©ãŒã®éçã³ãŒãçæã®å®è£ ã¯ãå éšã¢ãŒããã¯ãã£ãšã³ãŒãçæã®ãã©ã°ã€ã³ã§å€ãã®å€æŽãè¡ãå¿ èŠããããããå°ã極端ãªã¹ãããã«ãªããŸãã åå°ã®ããã«èŠãããé«éãªãã®ã¯ãããŸãã
LambdaMetafactory-åãã¡ãœããåŒã³åºãã§ãããããé«éã§ã
Java 7ã§ã¯ãJVMã«æ°ããåœä»€invokedynamic
å°å
¥ãããŸããã 圌女ã«ã€ããŠã¯ã ããã§jug.ruã«é¢ãããŠã©ãžããŒã«ã»ã€ã¯ããã«ããçŽ æŽãããå ±åããããŸã ã ããšããšGroovyã®ãããªåçèšèªã§äœ¿çšããããã«èæ¡ããããã®åœä»€ã¯ããªãã¬ã¯ã·ã§ã³ã䜿çšããã«Javaã§ã¡ãœãããåŒã³åºãããã®çŽ æŽãããåè£ã§ããã æ°ããåœä»€ãšãšãã«ãé¢é£ããAPIãJDKã«ç»å ŽããŸããã
-
MethodHandle
ã¯ã©ã¹MethodHandle
7ã§ç»å ŽããŸãããããŸã ããŸã䜿çšãããŠããŸãã -
LambdaMetafactory
ãã®ã¯ã©ã¹ã¯ãã§ã«Java 8ããã®ãã®ã§ãåçåŒã³åºãçšã®APIã®ãããªãéçºãšãªããMethodHandle
å éšã§äœ¿çšããŠããŸãã
æ¬è³ªçã«ã¡ãœããïŒã³ã³ã¹ãã©ã¯ã¿ãŒãªã©ïŒãžã®åä»ããã€ã³ã¿ãŒã§ããMethodHandle
ã java.lang.reflect.Method
ã®åœ¹å²ãæããããšãã§ããããã«æãããŸããã ãŸããååŒã³åºãã§Reflection APIã§å®è¡ããããã¹ãŠã®ã¿ã€ããã§ãã¯ã¯ããã®å Žåã MethodHandle
ãšãã«1åã ãå®è¡ããããããåŒã³åºãã¯é«éã«ãªããŸãã
ãããã MethodHandle
ãçŽç²ãªMethodHandle
ã¯ãªãã¬ã¯ã·ã§ã³APIãä»ããåŒã³åºããããããã«é
ãããšãå€æããŸããã MethodHandle
éçã«ããããšã§ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããããã¹ãŠã®å Žåã§ã¯ãããŸããã OpenJDKã¡ãŒãªã³ã°ãªã¹ãã§MethodHandle
åŒã³åºãã®é床ã«ã€ããŠåªããè°è«ããããŸã ã
ãããã LambdaMetafactory
ã¯ã©ã¹LambdaMetafactory
ãšããã¡ãœããåŒã³åºããé«éåããæ¬åœã®ãã£ã³ã¹ããããŸããã LambdaMetafactory
䜿çšLambdaMetafactory
ãšãã©ã ããªããžã§ã¯ããäœæãããã®äžã«çŽæ¥ã¡ãœããåŒã³åºããã©ããããããšãã§ããŸããããã¯ã MethodHandle
ããååŸã§ããŸãã ãããŠãçæããããªããžã§ã¯ãã䜿çšããŠãç®çã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã BiFunctionã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããã²ãã¿ãŒã¡ãœãããã©ããããçæã®äŸã次ã«ç€ºããŸãã
private BiFunction createGetHandlerLambda(Object bean, Method method) throws Throwable { MethodHandles.Lookup caller = MethodHandles.lookup(); CallSite site = LambdaMetafactory.metafactory(caller, "apply", MethodType.methodType(BiFunction.class), MethodType.methodType(Object.class, Object.class, Object.class), caller.findVirtual(bean.getClass(), method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes()[0])), MethodType.methodType(method.getReturnType(), bean.getClass(), method.getParameterTypes()[0])); MethodHandle factory = site.getTarget(); BiFunction listenerMethod = (BiFunction) factory.invoke(); return listenerMethod; }
ãã®çµæãMethodã§ã¯ãªãBiFunctionã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸãã ãããŠãã³ãŒãã§Methodã䜿çšããå Žåã§ãããããBiFunctionã«çœ®ãæããããšã¯é£ãããããŸããã Spring Frameworkãã@EventListener
ãšããŒã¯ãããã¡ãœãããã³ãã©ãŒãåŒã³åºãããã®å®éã®ïŒå°ãç°¡ç¥åããããçã®ïŒã³ãŒããèŠãŠã¿ãŸãããã
public class ApplicationListenerMethodAdapter implements GenericApplicationListener { private final Method method; public void onApplicationEvent(ApplicationEvent event) { Object bean = getTargetBean(); Object result = this.method.invoke(bean, event); handleResult(result); } }
ãããŠãããã¯åãã³ãŒãã§ãããã©ã ããä»ããã¡ãœããåŒã³åºãã䜿çšããŠããŸãïŒ
public class ApplicationListenerLambdaAdapter extends ApplicationListenerMethodAdapter { private final BiFunction funHandler; public void onApplicationEvent(ApplicationEvent event) { Object bean = getTargetBean(); Object result = funHandler.apply(bean, event); handleResult(result); } }
æå°éã®å€æŽãæ©èœã¯åãã§ãããå©ç¹ããããŸãïŒ
ã©ã ãã«ã¯åããããŸã-äœææã«æå®ãããããããã¡ãœããã ããã®åŒã³åºãã¯å€±æããŸãã
ãã¬ãŒã¹ã¹ã¿ãã¯ã¯çããªããŸã -ã©ã ããä»ããŠã¡ãœãããåŒã³åºãå Žåãè¿œå ã®åŒã³åºãã1ã€ã ãè¿œå ããapply()
ã ãããŠããã ãã§ãã 次ã«ãã¡ãœããèªäœãåŒã³åºãããŸãã
ãã ããé床ã枬å®ããå¿ èŠããããŸãã
é床ã枬å®ãã
仮説ããã¹ãããããã«ã JMHã䜿çšããŠãã€ã¯ããã³ãããŒã¯ãäœæãããªãã¬ã¯ã·ã§ã³APIãLambdaMetafactoryãä»ããŠåãã¡ãœãããåŒã³åºããšãã®å®è¡æéãšã¹ã«ãŒããããæ¯èŒããæ¯èŒã®ããã®çŽæ¥ã¡ãœããåŒã³åºããè¿œå ããŸããã ã¡ãœãããšã©ã ããžã®ãªã³ã¯ã¯ããã¹ãã®éå§åã«äœæããã³ãã£ãã·ã¥ãããŸããã
ãã¹ããã©ã¡ãŒã¿ïŒ
@BenchmarkMode({Mode.Throughput, Mode.AverageTime}) @Warmup(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS) @Measurement(iterations = 10, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
ãã¹ãèªäœã¯ã GitHubããããŠã³ããŒãã㊠ãå¿ èŠã«å¿ããŠèªåã§å®è¡ã§ããŸãã
Oracle JDK 11.0.2ããã³JMH 1.21ã®ãã¹ãçµæïŒæ°å€ã¯ç°ãªãå ŽåããããŸãããéãã¯é¡èã§ã»ãŒåãã§ãïŒïŒ
ãã¹ã-å€ãååŸ | ã¹ã«ãŒãããïŒops / usïŒ | å®è¡æéïŒus / opïŒ |
---|---|---|
LambdaGetTest | 72 | 0.0118 |
ReflectionGetTest | 65 | 0.0177 |
DirectMethodGetTest | 260 | 0.0048 |
ãã¹ã-èšå®å€ | ã¹ã«ãŒãããïŒops / usïŒ | å®è¡æéïŒus / op |
LambdaSetTest | 96 | 0.0092 |
ReflectionSetTest | 58 | 0.0173 |
DirectMethodSetTest | 415 | 0.0031 |
å¹³åããŠãã©ã ããä»ããã¡ãœããã®åŒã³åºãã¯ããªãã¬ã¯ã·ã§ã³APIã䜿çšããå ŽåãããçŽ30ïŒ é«éã§ããããšãå€æããŸããã 誰ãã詳现ã«èå³ãããå Žåã¯ã ããã§ã¡ãœããåŒã³åºãã®ããã©ãŒãã³ã¹ã«ã€ããŠå¥ã®çŽ æŽãããè°è«ããããŸãã ç°¡åã«èšãã°ãçæãããã©ã ããããã°ã©ã ã³ãŒãã«ã€ã³ã©ã€ã³åã§ãããªãã¬ã¯ã·ã§ã³ãšã¯ç°ãªããã¿ã€ããã§ãã¯ããŸã å®è¡ãããŠããªããšããäºå®ã«ãããé床ã®åäžãåŸãããŸãã
ãã¡ããããã®ãã³ãããŒã¯ã¯éåžžã«åçŽã§ãããã¯ã©ã¹éå±€å ã®ã¡ãœããã®åŒã³åºãããæçµã¡ãœããã®åŒã³åºãé床ã®æž¬å®ã¯å«ãŸããŠããŸããã ããããããè€éãªæž¬å®ãè¡ããçµæã¯åžžã«LambdaMetafactoryã®äœ¿çšãæ¯æããŠããŸããã
䜿çšãã
CUBAããŒãžã§ã³7ãã¬ãŒã ã¯ãŒã¯ã®UIã³ã³ãããŒã©ãŒã§ã¯ã @Subscribe
ã¢ãããŒã·ã§ã³ã䜿çšããŠãç¹å®ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã€ãã³ãã«ã¡ãœããã«ã眲åãã§ããŸãã å
éšçã«ã¯ãããã¯LambdaMetafactory
ã«å®è£
ãããŠLambdaMetafactory
ããªã¹ããŒã¡ãœãããžã®ãªã³ã¯ã¯æåã®åŒã³åºãã§äœæããã³ãã£ãã·ã¥ãããŸãã
ãã®é©æ°ã«ãããç¹ã«å€æ°ã®èŠçŽ ãè€éãªçžäºäœçšããããã£ãŠå€æ°ã®ã€ãã³ããã³ãã©ãŒãå«ããã©ãŒã ã®å Žåã«ãã³ãŒãã倧å¹
ã«ã¯ãªã¢ããããšãå¯èœã«ãªããŸããã CUBAã¯ã€ãã¯ã¹ã¿ãŒãã®ç°¡åãªäŸïŒã¢ã€ãã ãè¿œå ãŸãã¯åé€ãããšãã«æ³šæé¡ãåèšç®ããå¿
èŠããããšæ³åããŠãã ããã ãšã³ãã£ãã£ã§ã³ã¬ã¯ã·ã§ã³ãå€æŽããããšãã«calculateAmount()
ã¡ãœãããå®è¡ããã³ãŒããèšè¿°ããå¿
èŠããããŸãã 以åã®æ§åïŒ
public class OrderEdit extends AbstractEditor<Order> { @Inject private CollectionDatasource<OrderLine, UUID> linesDs; @Override public void init( Map<String, Object> params) { linesDs.addCollectionChangeListener(e -> calculateAmount()); } ... }
ãŸããCUBA 7ã§ã¯ãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
public class OrderEdit extends StandardEditor<Order> { @Subscribe(id = "linesDc", target = Target.DATA_CONTAINER) protected void onOrderLinesDcCollectionChange (CollectionChangeEvent<OrderLine> event) { calculateAmount(); } ... }
çµè«ïŒã³ãŒãã¯ç°¡æœã§ãããããžãã¯init()
ã¡ãœããã¯ãããŸããããã®ã¡ãœããã¯ããã©ãŒã ã®è€éããå¢ãã«ã€ããŠãã€ãã³ããã³ãã©ãŒãæ¡åŒµããŠåããããšãã§ããŸãã ããã-賌èªããŠããã³ã³ããŒãã³ãã§ãã£ãŒã«ããäœæããå¿
èŠãããããŸãããCUBAã¯ãã®ã³ã³ããŒãã³ããIDã§æ€çŽ¢ããŸãã
çµè«
AOTã³ã³ãã€ã«ãåããæ°äžä»£ã®ãã¬ãŒã ã¯ãŒã¯ïŒ Micronaut ã Quarkus ïŒã®åºçŸã«ãé¢ãããããäŒçµ±çãªããã¬ãŒã ã¯ãŒã¯ïŒäž»ã«Springãšæ¯èŒãããŸãïŒã«æ¯ã¹ãŠåŠå®ã§ããªãå©ç¹ããããŸããããªãã¬ã¯ã·ã§ã³APIã䜿çšããŠèšè¿°ããã倧éã®ã³ãŒãããŸã ãããŸãïŒãããŠãåãæ¥ã«æè¬ããŸãïŒã ãããŠãSpring Frameworkã¯çŸåšãã¢ããªã±ãŒã·ã§ã³éçºãã¬ãŒã ã¯ãŒã¯ã®ãªãŒããŒã§ãããä»åŸããªãã¬ã¯ã·ã§ã³ããŒã¹ã®ã³ãŒãã䜿çšããŠããäºå®ã§ãã
ãŸããã³ãŒãã§Reflection APIã䜿çšããããšãèããŠããå ŽåïŒã¢ããªã±ãŒã·ã§ã³ã§ããããšãã¬ãŒã ã¯ãŒã¯ã§ããããšïŒãããèããŠãã ããã ãŸããã³ãŒãçæã«ã€ããŠã次ã«MethodHandles / LambdaMetafactoryã«ã€ããŠã 2çªç®ã®æ¹æ³ã¯ããé«éã§ããããšãå€æããReflection APIã䜿çšããå Žåãããéçºäœæ¥ãè²»ããããããšã¯ãããŸããã
ããã«äŸ¿å©ãªãªã³ã¯ïŒ
Java Reflectionã®ããé«éãªä»£æ¿æ段
Javaã§ã®ã©ã ãåŒã®ãããã³ã°
Javaã®ã¡ãœãããã³ãã«
Java Reflectionããã ãã¯ããã«é«é
LambdaMetafactoryãéçMethodHandleãã10ïŒ
é
ãããééçMethodHandleãã80ïŒ
éãã®ã¯ãªãã§ããïŒ
éãããã倧ããããïŒJavaã§ã®ã¡ãœããåŒã³åºãã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžãããã®ã¯äœã§ããïŒ