- ã³ã³ãã€ã«åŸãŸãã¯ã³ãŒãã®ããŒãäžã«ããã°ã©ã ã®å®è¡å¯èœã³ãŒããæäœããŸãã
- ã³ã³ãã€ã«ããåã«ãœãŒã¹ã³ãŒããå€æŽããŸãã
ã¡ã¢å ã®ç»åã«é¢é£ä»ããããŠããã¡ã¿ãã¡ãŒïŒããã°ã©ã ã¯äž»èŠãªå»ºç©ã§ãããããã°ã©ã ã®å€æã®çµæã¯è£å©çãªæ§é ã§ãã
å€æŽããçç±
ããã°ã©ã ãå¥ã®ããã°ã©ã ãå€æŽããå¿ èŠãããçç±ãå°ããããšããå§ããŸãããã ã¡ã¿ããã°ã©ãã³ã°ã¯ããããžã§ã¯ãã®å®åã³ãŒããåæžããäž»èŠãªããšã«éäžããã³ãŒãã®èªã¿ããããåäžãããå¥ã®æ¹æ³ã§ã¯è§£æ±ºãå°é£ãªåé¡ã解決ããã®ã«åœ¹ç«ã¡ãŸãã
javaã®æãåçŽãªäŸã¯ãã¯ã©ã¹ã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããã®JavaBeansããã³get / setã¡ãœããã§ããäŸã¯ãã¯ã©ã¹ã®ãã«ããŒã®äœæãIDEã§ã®equals / hashã®å®è£ ãªã©ã§ãã
次ã®äŸã¯ããã®ã³ã°ãèªåãã©ã³ã¶ã¯ã·ã§ã³ç®¡çã§ãã Spring Frameworkã䜿çšãããšãã¯ãã¹ãŠã䜿çšãããã©ã®ããã«å®è£ ããããã«ã€ããŠã¯ã»ãšãã©èããŸããã ããããSpringã§ãããåå¿è åãã®ãã¬ãŒã ã¯ãŒã¯ã®æ§æãšåæåã«åé¡ãçãããéæ³ã®ã Spring Boot / Spring Rooãç»å ŽããŸãã ã ããããããã¯å¥ã®ãããã¯ã§ãããããã°ã©ã ã®ä¿®æ£ã®ãããã¯ã«æ»ããŸãã
é£èªåãšã³ãŒãã®æå°åãèšè£ ããããããã¡ã€ã©ãŒãDevOpsã®äžçã¯ãããã°ã©ã ãå€æŽããå¿ èŠãããçç±ã®3çªç®ã®äŸã§ãã ä»ã®éèŠãªäŸãèŠéãããšæãã®ã§ãã³ã¡ã³ããè¿œå ããŠãã ããã
ã ããããªãããã°ã©ã ãå€æŽããã®ããç§ãã¡ã¯ä»ã圌ããéåžžãããã©ã®ããã«è¡ãããæ€èšããããšã«ããŸãã ã
å®è¡å¯èœããã°ã©ã åœä»€ã®å€æŽ
ããã°ã©ã ã®ãã€ãã³ãŒããå€æŽã§ããŸãããããæãäžè¬çãªæ¹æ³ã§ãã ããã¯ãã³ã³ãã€ã«çŽåŸãjarããã«ãããåãããã³ã¯ã©ã¹ãããŒããããšãã«å®è¡ã§ããŸãã æåã®ã±ãŒã¹ã§ã¯ããããžã§ã¯ããã«ãã·ã¹ãã ã®ãã©ã°ã€ã³ã2çªç®ã®ã±ãŒã¹ã§ã¯ãç¹å¥ãªã¯ã©ã¹ããŒããŒãŸãã¯JavaãšãŒãžã§ã³ãããŸãã¯jvmã®hotswapã¡ã«ããºã ã«ãªããŸãã ãšãŒãžã§ã³ããšã¯ã©ã¹ããŒããŒã䜿çšããã¢ãããŒãã¯ããã·ã³ã³ãŒãããã³ããªã¢ãŒãã£ãã¯ãŠã€ã«ã¹ã®èªå·±å€æŽããã°ã©ã ã«éåžžã«äŒŒãŠããŸãã
jvmãããŒããããã¡ã€ã«ã®ãã€ãã³ãŒãã®æ§é ã¯ãã¯ã©ã¹åœ¢åŒã®å ¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããŸã
javapã¢ããªã±ãŒã·ã§ã³ã䜿çšãããšãã³ã³ãã€ã«ãããã¯ã©ã¹ã®ãã€ãã³ãŒãã衚瀺ã§ããŸã
å
¬åŒããã¥ã¡ã³ãã®äŸ
ã¯ã©ã¹ã®ãœãŒã¹ã³ãŒãïŒ
ãã®ã¯ã©ã¹ã®ãã€ãã³ãŒãã®ã³ã³ãœãŒã«ãžã®JavapåºåïŒ
import java.awt.*; import java.applet.*; public class DocFooter extends Applet { String date; String email; public void init() { resize(500,100); date = getParameter("LAST_UPDATED"); email = getParameter("EMAIL"); } public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15); } }
ãã®ã¯ã©ã¹ã®ãã€ãã³ãŒãã®ã³ã³ãœãŒã«ãžã®JavapåºåïŒ
Compiled from "DocFooter.java" public class DocFooter extends java.applet.Applet { java.lang.String date; java.lang.String email; public DocFooter(); Code: 0: aload_0 1: invokespecial #1 // Method java/applet/Applet."<init>":()V 4: return public void init(); Code: 0: aload_0 1: sipush 500 4: bipush 100 6: invokevirtual #2 // Method resize:(II)V 9: aload_0 10: aload_0 11: ldc #3 // String LAST_UPDATED 13: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String; 16: putfield #5 // Field date:Ljava/lang/String; 19: aload_0 20: aload_0 21: ldc #6 // String EMAIL 23: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String; 26: putfield #7 // Field email:Ljava/lang/String; 29: return public void paint(java.awt.Graphics); Code: 0: aload_1 1: new #8 // class java/lang/StringBuilder 4: dup 5: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V 8: aload_0 9: getfield #5 // Field date:Ljava/lang/String; 12: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: ldc #11 // String by 17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 20: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 23: bipush 100 25: bipush 15 27: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V 30: aload_1 31: aload_0 32: getfield #7 // Field email:Ljava/lang/String; 35: sipush 290 38: bipush 15 40: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V 43: return }
ãããããã€ãã³ãŒããæåã§å€æŽããããšã¯ãæè²ç®çãŸãã¯å°é£ãäœæããŠå æããã®ã奜ããªå¿è ã§ããå Žåã«ã®ã¿æå³ããããŸãã Java Virtual Machine Specificationã¯ããã®æç¹ã§ã»ãšãã©ã®è³ªåã«çããŠããŸãã
ç£æ¥çšããã°ã©ãã³ã°ã§ã¯ã ASM ã javassist ã BCEL ã CGLIBã©ã€ãã©ãªããã€ãã³ãŒãã§ã®äœæ¥ãç°¡çŽ åããŸãã ãã€ãã³ãŒãã解æããåŸãããã°ã©ãã¯ãåãASMã䜿çšããŠãããªãŒAPIãšããžã¿ãŒãã³ãã¬ãŒãã䜿çšããã€ãã³ãã¢ãã«ã®äž¡æ¹ã§ãã€ãã³ãŒããæäœã§ããŸãã åæã«å ããŠãæ°ããæ瀺ããã£ãŒã«ããã¡ãœãããªã©ãå€æŽãè¿œå ããããšãã§ããŸãã æ¬æ¥ããã€ãã³ãŒããæäœããããã®ã©ã€ãã©ãªã¯ä»ã«ããããŸãããããŸã䜿çšãããŸããã
ASM APIã®äŸ
ãã€ãã³ãŒãåæ
/*** * ASM examples: examples showing how ASM can be used * Copyright (c) 2000-2011 INRIA, France Telecom * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.objectweb.asm.ClassReader; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.IincInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.VarInsnNode; import org.objectweb.asm.tree.analysis.Analyzer; import org.objectweb.asm.tree.analysis.BasicValue; import org.objectweb.asm.tree.analysis.BasicVerifier; import org.objectweb.asm.tree.analysis.Frame; import org.objectweb.asm.tree.analysis.SourceInterpreter; import org.objectweb.asm.tree.analysis.SourceValue; import org.objectweb.asm.util.TraceMethodVisitor; import org.objectweb.asm.util.Textifier; /** * @author Eric Bruneton */ public class Analysis implements Opcodes { public static void main(final String[] args) throws Exception { ClassReader cr = new ClassReader("Analysis"); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_DEBUG); List<MethodNode> methods = cn.methods; for (int i = 0; i < methods.size(); ++i) { MethodNode method = methods.get(i); if (method.instructions.size() > 0) { if (!analyze(cn, method)) { Analyzer<?> a = new Analyzer<BasicValue>( new BasicVerifier()); try { a.analyze(cn.name, method); } catch (Exception ignored) { } final Frame<?>[] frames = a.getFrames(); Textifier t = new Textifier() { @Override public void visitMaxs(final int maxStack, final int maxLocals) { for (int i = 0; i < text.size(); ++i) { StringBuilder s = new StringBuilder( frames[i] == null ? "null" : frames[i].toString()); while (s.length() < Math.max(20, maxStack + maxLocals + 1)) { s.append(' '); } System.err.print(Integer.toString(i + 1000) .substring(1) + " " + s + " : " + text.get(i)); } System.err.println(); } }; MethodVisitor mv = new TraceMethodVisitor(t); for (int j = 0; j < method.instructions.size(); ++j) { Object insn = method.instructions.get(j); ((AbstractInsnNode) insn).accept(mv); } mv.visitMaxs(0, 0); } } } } /* * Detects unused xSTORE instructions, ie xSTORE instructions without at * least one xLOAD corresponding instruction in their successor instructions * (in the control flow graph). */ public static boolean analyze(final ClassNode c, final MethodNode m) throws Exception { Analyzer<SourceValue> a = new Analyzer<SourceValue>( new SourceInterpreter()); Frame<SourceValue>[] frames = a.analyze(c.name, m); // for each xLOAD instruction, we find the xSTORE instructions that can // produce the value loaded by this instruction, and we put them in // 'stores' Set<AbstractInsnNode> stores = new HashSet<AbstractInsnNode>(); for (int i = 0; i < m.instructions.size(); ++i) { AbstractInsnNode insn = m.instructions.get(i); int opcode = insn.getOpcode(); if ((opcode >= ILOAD && opcode <= ALOAD) || opcode == IINC) { int var = opcode == IINC ? ((IincInsnNode) insn).var : ((VarInsnNode) insn).var; Frame<SourceValue> f = frames[i]; if (f != null) { Set<AbstractInsnNode> s = f.getLocal(var).insns; Iterator<AbstractInsnNode> j = s.iterator(); while (j.hasNext()) { insn = j.next(); if (insn instanceof VarInsnNode) { stores.add(insn); } } } } } // we then find all the xSTORE instructions that are not in 'stores' boolean ok = true; for (int i = 0; i < m.instructions.size(); ++i) { AbstractInsnNode insn = m.instructions.get(i); int opcode = insn.getOpcode(); if (opcode >= ISTORE && opcode <= ASTORE) { if (!stores.contains(insn)) { ok = false; System.err.println("method " + m.name + ", instruction " + i + ": useless store instruction"); } } } return ok; } /* * Test for the above method, with three useless xSTORE instructions. */ public int test(int i, int j) { i = i + 1; // ok, because i can be read after this point if (j == 0) { j = 1; // useless } else { try { j = j - 1; // ok, because j can be accessed in the catch int k = 0; if (i > 0) { k = i - 1; } return k; } catch (Exception e) { // useless ASTORE (e is never used) j = j + 1; // useless } } return 0; } }
ã¢ã¹ãã¯ãæåã®ã¢ãããŒãã¯ãããã°ã©ã ãå€æŽããããã®é«åºŠãªæ¹æ³ãšèããããšãã§ããŸãã ãšãŒãžã§ã³ããã¯ã©ã¹ããŒããŒããŸãã¯ãã©ã°ã€ã³ã¬ãã«ã§ã®AspectJå®è£ ã§ã¯ãAOPã®ãã¹ãŠã®ãéæ³ããã¯ã©ã¹ãã€ãã³ãŒãã®æäœã«å€ãããŸãã ããããããã°ã©ããéçºäžã«ãããèŠããšãåãASMãšBCELã䜿çšããŠãå éšã§ããã€ãã³ãŒããå€æŽãããæ¹æ³ãšã¯ç°ãªããŸãã AspectJãå®éã«ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã¹ã«è¿œå ãããã®ã«èå³ãããå Žåãå€æŽãããã¯ã©ã¹ã®ãã³ããå«ããŠãããšãã°Java Decompilerã䜿çšããŠããã®ã³ãŒããã³ã¢ã«å ¥ããããšãã§ããŸã ã
AspectJã§ã¯ãéçºè ã¯ã¢ã¯ã·ã§ã³ãã¯ã©ã¹ã®åœ¢åŒã§å®çŸ©ããããããã¢ã¹ãã¯ããšããŠæ³šéããããã°ã©ã ã®ã©ã®ãã€ã³ãïŒPointcutïŒã§åŒã³åºãå¿ èŠããããã瀺ããŸãã ãã€ã³ãã«ããåŒãå®çŸ©ããããã®æ§æãéåžžã«é«åºŠã§ãã ãã€ãã³ãŒãã®å€æŽã«å¯Ÿãããã®ã¢ãããŒãã¯ãããã°ã©ãã«ãšã£ãŠäœ¿ããããã§ãã
habrã«é¢ããåºçç©ã®ãµã€ã¯ã«ã®äŸã«ã€ããŠããã詳现ã«ç€ºããèªã£ã
- çç±ã蚺æããJARå°çã§çãæ®ããŸããç¡«é»ãåžããããã€ã©ãŒã§æ²žéš°ããŸãã
- Elasticsearchã§ã®ãã°ã®å ¬é-æ£èŠè¡šçŸãšlogstashã®ãªãç掻
- æ¢åã®ã¢ããªã±ãŒã·ã§ã³ã§ã®JDBCã¯ãšãªãšãã®ãã©ã¡ãŒã¿ãŒã®ãã®ã³ã°
- Habrã·ã§ã«ïŒJavaã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã¹ãã©ãããã©ãŒã sshãµãŒããŒãåã蟌ã¿ãŸã
- SonarQubeã®äŸã§ã®jvmããã»ã¹ã§ã®Webã³ã³ãœãŒã«ã®å®è£
- ã¬ããŒãïŒãJavaéçºè ããã³QAåãã®åæ£ã·ã¹ãã ã§ã®ã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ã
- ãã¡ã€ã«ãç°ãªãããJavaããã°ã©ã ã®ããã¡ã€ã«ãã«é¢ããã¹ããŒãªãŒ
ãã€ãã³ãŒãã®å€æŽã«ããããã°ã©ã ã®å€æã«ã¯ãé·æãšçæããããŸãã
é·æ | çæ |
---|---|
ãœãŒã¹ã³ãŒãããªããŠãã¢ãããŒãã¯æ©èœããŸã | èªæã§ãªãå€æã䌎ãåæãšä¿®æ£ã®è€éã |
ã³ã³ãã€ã©ã®ç¬ç« | ãœãŒã¹ã³ãŒãã§ã®ã¿å©çšå¯èœãªæ å ±ã®æ¬ åŠ |
å€æASTãœãŒã¹ã³ãŒããã¡ã¿ããã°ã©ãã³ã°
ãœãŒã¹ã³ãŒãã®å€æã®çè«ãšå®è·µã¯ãããã°ã©ãã³ã°èšèªã®ã¡ã¿ããã°ã©ãã³ã°ãPrologãLispããã¯ããããã³ããªããã»ããµã§é·ãé䜿çšãããŠããŸããã
ãã®ã¢ãããŒãã§ã¯ãããã°ã©ã ã®ãœãŒã¹ã³ãŒããã³ã³ãã€ã«ãããåã«å¥ã®ããã°ã©ã ã«ãã£ãŠå€æãŸãã¯è£å®ãããã³ã³ãã€ã«ãããŸãã ããã°ã©ã ããã¹ãèªäœã§ã¯ãªããããããæ§ç¯ãããæœè±¡çãªæ§æããªãŒïŒæœè±¡æ§æããªãŒãASTïŒã䜿çšããæ¹ã䟿å©ã§ãã
ç¹°ãè¿ããŸãããã¡ã¿ããã°ã©ãã³ã°ã®å©äŸ¿æ§ã¯ãããã°ã©ãã³ã°èšèªèªäœã§ã®ãµããŒãã«äŸåããŸãã åè«ããããŸã
Lispã§ã¯ãã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ãæ¢ããŠããã®ã§ããã°ãããã€ãã®ãã¯ããèšç»ããã ãã§ååã§ãã Javaã§ã¯ãGregor Kichalesãå¿ èŠã§ãæ°ããäŒç€Ÿãäœããäœã¶æãäœå¹Žããã¹ãŠãæ©èœãããããšããŸããããŒã¿ãŒã»ããŒãŠã£ã°
ãããã£ãŠããªãã¬ã¯ã·ã§ã³ã¡ã«ããºã ã¯èšèªã®äžéšã§ããããã©ãããã©ãŒã ã¯ãã€ãã³ãŒããåçã«ããŒãããã³å®è¡ã§ããŸãããjvmã¯ããå°ãè€éã§ãã ã³ãŒãçæã䜿çšãã2ã€ã®æè¡-JPAéçã¡ã¿ã¢ãã«ãžã§ãã¬ãŒã¿ãŒãšjaxbã³ãŒãçæ-ãããã«æãæµ®ãã³ãŸãã ãã1ã€ã®äŸã¯ãããžã§ã¯ãLombokã§ã ãããã«ãããIDEã«ãã£ãŠä»¥åã«çæããããã®ããŸãã¯æåã§èšè¿°ãããéçºè ã«ãã£ãŠãµããŒãããããã®ãèªåçã«å®è£ ã§ããŸãã
Lombokãããžã§ã¯ãã®æ³šé
val
ã€ãã«ïŒ æéã®ããããªãæçµããŒã«ã«å€æ°ã
@ NonNull
ãŸãã¯ïŒå¿é ãæ¢ããŠNullPointerExceptionãæããããšãåŠãã æ¹æ³ã
@ã¯ãªãŒã³ã¢ãã
èªåãªãœãŒã¹ç®¡çïŒç°¡åã«closeïŒïŒã¡ãœãããåŒã³åºããŸãã
@ã²ãã¿ãŒ/ @ã»ãã¿ãŒ
public int getFooïŒïŒ{return foo;}ãå床èšè¿°ããªãã§ãã ããã
@ãã¹ããªã³ã°
ãã£ãŒã«ãã確èªããããã«ãããã¬ãèµ·åããå¿ èŠã¯ãããŸããïŒlombokã«toStringãçæãããã ãã§ãïŒ
@ EqualsAndHashCode
ç°¡åãªå¹³çæ§ïŒhashCodeãçæãããªããžã§ã¯ãã®ãã£ãŒã«ãããå®è£ ãåçã«ããŸãã
@ NoArgsConstructorã@ RequiredArgsConstructorãããã³@ AllArgsConstructor
ãªãŒããŒã¡ã€ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒåŒæ°ãæããªãã³ã³ã¹ãã©ã¯ã¿ãŒãæçµ/éNULLãã£ãŒã«ãããšã«1ã€ã®åŒæ°ããŸãã¯ãã¹ãŠã®ãã£ãŒã«ãããšã«1ã€ã®åŒæ°ãçæããŸãã
@ããŒã¿
ãã¹ãŠäžç·ã«ïŒ@ ToStringã@ EqualsAndHashCodeããã¹ãŠã®ãã£ãŒã«ãã®@ Getterãããã³ãã¹ãŠã®éæçµãã£ãŒã«ãã®@ Setterãããã³@ RequiredArgsConstructorã®ã·ã§ãŒãã«ããïŒ
@å€
äžå€ã¯ã©ã¹ãéåžžã«ç°¡åã«ãªããŸããã
@ãã«ããŒ
...ãããŠããã¯ããªãã®ããã§ãïŒãªããžã§ã¯ãäœæã®ããã®é¢åãªåã£ããã³ãAPIã¯ãããŸããïŒ
@SneakyThrows
ãããŸã§èª°ãã¹ããŒããŠããªããã§ãã¯äŸå€ã倧èã«ã¹ããŒããïŒ
@åææžã¿
åæå®äºïŒããã¯ãå ¬éããªãã§ãã ããã
@ GetterïŒlazy = trueïŒ
æ azineã¯çŸåŸ³ã§ãïŒ
@ãã°
è¹é·ã®ãã°ã24435.7ã®æ¥ä»ïŒããã®è¡ã¯äœã§ãããïŒã
ã€ãã«ïŒ æéã®ããããªãæçµããŒã«ã«å€æ°ã
@ NonNull
ãŸãã¯ïŒå¿é ãæ¢ããŠNullPointerExceptionãæããããšãåŠãã æ¹æ³ã
@ã¯ãªãŒã³ã¢ãã
èªåãªãœãŒã¹ç®¡çïŒç°¡åã«closeïŒïŒã¡ãœãããåŒã³åºããŸãã
@ã²ãã¿ãŒ/ @ã»ãã¿ãŒ
public int getFooïŒïŒ{return foo;}ãå床èšè¿°ããªãã§ãã ããã
@ãã¹ããªã³ã°
ãã£ãŒã«ãã確èªããããã«ãããã¬ãèµ·åããå¿ èŠã¯ãããŸããïŒlombokã«toStringãçæãããã ãã§ãïŒ
@ EqualsAndHashCode
ç°¡åãªå¹³çæ§ïŒhashCodeãçæãããªããžã§ã¯ãã®ãã£ãŒã«ãããå®è£ ãåçã«ããŸãã
@ NoArgsConstructorã@ RequiredArgsConstructorãããã³@ AllArgsConstructor
ãªãŒããŒã¡ã€ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒåŒæ°ãæããªãã³ã³ã¹ãã©ã¯ã¿ãŒãæçµ/éNULLãã£ãŒã«ãããšã«1ã€ã®åŒæ°ããŸãã¯ãã¹ãŠã®ãã£ãŒã«ãããšã«1ã€ã®åŒæ°ãçæããŸãã
@ããŒã¿
ãã¹ãŠäžç·ã«ïŒ@ ToStringã@ EqualsAndHashCodeããã¹ãŠã®ãã£ãŒã«ãã®@ Getterãããã³ãã¹ãŠã®éæçµãã£ãŒã«ãã®@ Setterãããã³@ RequiredArgsConstructorã®ã·ã§ãŒãã«ããïŒ
@å€
äžå€ã¯ã©ã¹ãéåžžã«ç°¡åã«ãªããŸããã
@ãã«ããŒ
...ãããŠããã¯ããªãã®ããã§ãïŒãªããžã§ã¯ãäœæã®ããã®é¢åãªåã£ããã³ãAPIã¯ãããŸããïŒ
@SneakyThrows
ãããŸã§èª°ãã¹ããŒããŠããªããã§ãã¯äŸå€ã倧èã«ã¹ããŒããïŒ
@åææžã¿
åæå®äºïŒããã¯ãå ¬éããªãã§ãã ããã
@ GetterïŒlazy = trueïŒ
æ azineã¯çŸåŸ³ã§ãïŒ
@ãã°
è¹é·ã®ãã°ã24435.7ã®æ¥ä»ïŒããã®è¡ã¯äœã§ãããïŒã
ããã¯ãASTãŠãŒã¶ãŒããã°ã©ã ãšã³ãŒãçæãå€æŽããããšã§Lombokã«å®è£ ãããŸãã
å¶éä»ãã®åæ§ã®æ©èœã¯ãã¹ã³ãŒãã³ã³ãã€ã«æã®æ³šéïŒæ³šéåŠçããŒã«ïŒã® javaã«ããããŸãã
JavaãœãŒã¹ã³ãŒãã解æããå Žåãjavacãeclipse javaã³ã³ãã€ã©ãããé©åã«åŠçã§ããŸãã SpoonãJTransformerãªã©ã®ä»£æ¿æ段ããããŸãããããããä»æ§ãšè€éãªã¯ã©ã¹ãã©ã®çšåºŠå®å šã«ãµããŒãããŠãããã確èªããå¿ èŠãããããŸããã
jvmã«ã€ããŠè©±ããŠãããããGroovyã§ã®ããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®å€æã¯èšèªèªäœã®äžéšã§ãã ã Scalaèšèªã«ãåæ§ã®å¯èœæ§ããããŸãã
ãã®ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®å€æŽã«ã¯åŒ±ç¹ãšé·æããããŸãã
é·æ | çæ |
---|---|
ãã€ãã³ãŒããããå€ãã®æ å ± | ã³ã³ãã€ã«ãŸãã¯è§£é段éïŒã¡ã¢ãªãæéïŒ |
IDEã®ãªãã¡ã¯ã¿ãªã³ã°ãªã©ã®æ©èœ | ãœãŒã¹ã®å¯çšæ§ã®èŠä»¶ãç¹å®ã®ã¯ã©ã¹/ jarã®ãœãŒã¹ãèªåçã«èŠã€ããæ¹æ³ |
å®è¡æã®ASTã³ãŒãå€æãšåã³ã³ãã€ã«
ãã®æçš¿ã®æãçéå ¥ãã®éšåã¯ãã©ã³ã¿ã€ã ãžã®åã³ã³ãã€ã«ã«ã€ããŠã®èãã§ãã æŸèæãå¿ èŠãªå Žåãå®è¡æ ã« AST Java ã³ãŒãã® å€æŽãšã³ã³ãã€ã«ãå¿ èŠã«ãªãå ŽåããããŸãããããžã§ã¯ããå®å šã«ã«ãããªããã§ããããç°ãªãããŒãžã§ã³ã®æ°åã®ãã©ãŒã¯ãäœæããŠç¶æããããšãéåžžã«å°é£ã§ããå ŽåããŸãã¯ç®¡çè ãšéçºè ããããçæ³çã§èª°ã«ãå€æŽãèš±å¯ããªãå ŽåããœãŒã¹ã³ãŒãã¯ãšã³ã¿ãŒãã©ã€ãºMavenãªããžããªã«ãããŸãã ãããŠããã®ã¢ãããŒããå¿ èŠãªã®ã¯ãåè¿°ã® 2ã€ã®ã¯ã©ã¹ã®ããã°ã©ã å€æã§åé¡ã解決ããããšãäžå¯èœãŸãã¯äžäŸ¿ãªå Žåã®ã¿ã§ã ã
ã³ã³ãã€ã«ã¯æ¯èŒçç°¡åã§ãã JavaCompiler APIã䜿çšãããšãå®è¡æã«ãœãŒã¹ã³ãŒãããããã°ã©ã ãã³ã³ãã€ã«ããå®è£ ã«äŸåããªãã€ã³ã¿ãŒãã§ã€ã¹ãæäŸã§ããŸãã eclipse EJCã³ã³ãã€ã©ãŒã®ãããã§ã¹ããšãœãŒã¹ã³ãŒãã調ã¹ããšãããJavaCompiler APIããµããŒãããŠããããšãããããŸããã
ããããããã°ã©ã ã®ããã¹ããåæãããšããASTã§äœæ¥ããããã®ãããªãã¯ããã³ãŠãããŒãµã«APIã¯ãŸã ãããŸããã ã€ãŸã com.sun.source.treeã*ãŸãã¯org.eclipse.jdt.core.domã®ãããããšé£æºããå¿ èŠããããŸãã
ã¯ã©ã¹ã®ãœãŒã¹ããã¹ããèŠã€ããã¿ã¹ã¯ã¯ããããžã§ã¯ãããœãŒã¹ã¿ã€ãã®ã¢ãŒãã£ãã¡ã¯ããšãšãã«mavenãªããžããªã§å ¬éãããã¯ã©ã¹ã®ããjarã«pom.propertiesãŸãã¯pom.xmlãã¡ã€ã«ãããå ŽåããŸãã¯ã¢ãŒãã£ãã¡ã¯ãã®åå/ããã·ã¥ã察å¿ããjarãã¡ã€ã«ã®ãœãŒã¹ã³ãŒãã«äžèŽããããã£ã¯ã·ã§ããªãããå Žåãç°¡åã«è§£æ±ºãããŸãããã°ã©ã ã®å®è¡äžã«ãããã®ãœãŒã¹ãååŸããæ¹æ³ã
é·æ-ãã€ãã³ãŒãã«ãããããå€ãã®æ å ±ãå€æã«å©çšã§ããã¢ããªã±ãŒã·ã§ã³ã¯ãããžã§ã¯ããåçµã¿ç«ãŠããå¿ èŠããªããAspectJãšãŒãžã§ã³ãã䜿çšããã®ãšã»ãŒåãããã䟿å©ã§ãããåæã«ããã€ãã³ãŒãå€æã䜿çšããŠå€æãå®è¡ããããšã¯ã§ãããéåžžã«æéãããããŸã
çæã¯ã以åã®ã¢ãããŒããšåãã§ãïŒã¡ã¢ãªãæéãããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®èŠä»¶ãããã³ãã®ã¯ã©ã¹ã§ãããèŠã€ããæ¹æ³ã
ejc + mavenã³ãŒãã®åœ¢åŒã§ã®äžèšã®äŸã¯ä»åŸæ°ãæã®ãã¡ã«äºå®ãããŠãããã¿ã¹ã¯ã¯éåžžã«éèŠã§ãã ããã«ééããŸãããïŒ Javaã³ãŒããå€æããå®è¡æã«åã³ã³ãã€ã«ããããšã«ãã£ãŠã®ã¿ãå®è·µã®ã©ã®ã¿ã¹ã¯ããšã¬ã¬ã³ãã«è§£æ±ºã§ããŸããïŒ
ãšããã§ã TinyCCã³ã³ãã€ã©ã®æ©èœãšãã®ãµã€ãºã¯ããã®ã¢ãããŒããCããã°ã©ã ã§ãå¯èœã§ããããšã蚌æããŠããŸãã
ãã®ããŒãã§ã¯ãããã°ã©ã ãä¿®æ£ããããã®ããã€ãã®ã¢ãããŒãããã®é·æãšçæãæ€èšããŸããã å®è¡å¯èœã³ãŒãã®å€æŽã¯ããäžè¬çã§ãããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã®ååšãšãã®åŸã®å€æãªãã«ãã¹ãŠã®ã¿ã¹ã¯ã解決ã§ããããã§ã¯ãããŸããã