рдЬрд╛рд╡рд╛ рдореЗрдВ рдирд┐рд╖рд┐рджреНрдз рдЕрдзрд┐рднрд╛рд░ рдпрд╛ рдкреБрд▓ рдХреЗ рддрд░реАрдХреЗ


рддрдХрдиреАрдХреА рдкрджреЛрдВ рдкрд░ рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ 2 рдмрд╣реБрдд рд╕рдорд╛рди рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:


рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдПрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдирд╣реАрдВред


interface WithPrimitiveInt { void m(int i); } interface WithInteger { void m(Integer i); } 

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдм рдпрд╣ рд╕рд╡рд╛рд▓ рдЖрдкрд╕реЗ рдкреВрдЫрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВред


рдХрднреА-рдХрднреА, рдЬреЛ рдЖрд╡реЗрджрдХ рдЙрддреНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрдЬрд╛рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ (рдмрд╛рдж рдореЗрдВ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ):


 interface S { String m(int i); } interface V { void m(int i); } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдореНрдореАрджрд╡рд╛рд░ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ Sm(int) рдФрд░ Vm(int) рд╕рдорд╛рди рд╣реИрдВ, рдЬрдмрдХрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реИред рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдЪ рд╣реИред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрднреА-рдХрднреА рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдФрд░ рдкреНрд░рд╢реНрди рдкреВрдЫрддрд╛ рд╣реВрдВ:


рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JVM рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХреБрдЫ рдХрд╛рд▓реНрдкрдирд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо JVM рд╕реНрддрд░ рдкрд░?


рдпрд╣ рдПрдХ рдРрд╕рд╛ рдкреНрд░рд╢реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрддреНрддрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЙрддреНрддрд░ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ, рд╕рд╣реА рдЙрддреНрддрд░ рдореМрдЬреВрдж рд╣реИред рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдмрд╛рдИрдЯрдХреЛрдб рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЬреЗрд╡реАрдПрдо рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реИред


рдЬрд╛рд╡рд╛ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдЬреЗрд╡реАрдПрдо рд╡рд┐рдзрд┐ рд╕рдВрднрд╛рд▓


рдЬрд╛рд╡рд╛ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рдЕрд░реНрдерд╛рдд рд╡рд┐рдзрд┐ рдирд╛рдо рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░) рдХрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрджрд▓реЗ рдореЗрдВ, рдЬреЗрд╡реАрдПрдо рдПрдХ рдЕрдпреЛрдЧреНрдп рд╡рд┐рдзрд┐ рдирд╛рдо (рдЕрд░реНрдерд╛рдд, рдмрд╕ рдПрдХ рд╡рд┐рдзрд┐ рдирд╛рдо) рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рд╕рдВрднрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╡рд┐рд╡рд░рдгрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдПрдХ рд╡рд╛рдкрд╕реА рд╡рд┐рд╡рд░рдгрдХ рдХреА рд╕реВрдЪреАред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо String m(int i) рд╡рд┐рдзрд┐ рдХреЛ рд╕реАрдзреЗ foo.Bar рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред foo.Bar рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд foo.Bar рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 INVOKEVIRTUAL foo/Bar.m (I)Ljava/lang/String; 

рдФрд░ рд╢реВрдиреНрдп m(int i) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:


 INVOKEVIRTUAL foo/Bar.m (I)V 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, JVM рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ String m(int i) рдФрд░ void m(int i) рд╕рд╛рде рдХрд╛рдлреА рд╕рд╣рдЬ рд╣реИред рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╕рднреА рдЗрд╕реА bytecode рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред


рдХреБрдВрдЧ рдлреВ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рд╕рд╛рде


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрд╕ рдФрд░ рд╡реА рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИ, рдЕрдм рд╣рдо рдПрдХ рдПрд╕рд╡реА рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рджреЛрдиреЛрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЕрдЧрд░ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдереА, рддреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


 public class SV implements S, V { public void m(int i) { System.out.println("void m(int i)"); } public String m(int i) { System.out.println("String m(int i)"); return null; } } 

рдмрд╛рдИрдЯреЗрдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯрд╡реЗрдм рдПрдПрд╕рдПрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛ рдХрд┐ рдмрд╛рдпреЛрдЯреЗрдХ рдЬреЗрд╡реАрдПрдо рдХрд╛ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрд╢реЛрдВ рдХреЛ рджреВрдВрдЧрд╛ рдФрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред


 ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); // package edio.java.experiments // public class SV implements S, V cw.visit(V1_7, ACC_PUBLIC, "edio/java/experiments/SV", null, "java/lang/Object", new String[]{ "edio/java/experiments/S", "edio/java/experiments/V" }); // constructor MethodVisitor constructor = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); constructor.visitCode(); constructor.visitVarInsn(Opcodes.ALOAD, 0); constructor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); constructor.visitInsn(Opcodes.RETURN); constructor.visitMaxs(1, 1); constructor.visitEnd(); // public String m(int i) MethodVisitor mString = cw.visitMethod(ACC_PUBLIC, "m", "(I)Ljava/lang/String;", null, null); mString.visitCode(); mString.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mString.visitLdcInsn("String"); mString.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mString.visitInsn(Opcodes.ACONST_NULL); mString.visitInsn(Opcodes.ARETURN); mString.visitMaxs(2, 2); mString.visitEnd(); // public void m(int i) MethodVisitor mVoid = cw.visitMethod(ACC_PUBLIC, "m", "(I)V", null, null); mVoid.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mVoid.visitLdcInsn("void"); mVoid.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mVoid.visitInsn(Opcodes.RETURN); mVoid.visitMaxs(2, 2); mVoid.visitEnd(); cw.visitEnd(); 

рдЖрдЗрдП ClassWriter рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ ClassWriter рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред


рдЕрдм рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрд╕ рдФрд░ рд╡реА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрд╕рд╡реА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдЫрджреНрдо рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╣рдо рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИред


рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╣рдо java.io.PrintStream рдХреЗ System.out рдлрд╝реАрд▓реНрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдФрд░ рдЗрд╕реЗ рдСрдкрд░реЗрдВрдб рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рддрдм рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ ( String рдпрд╛ void ) рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдореА рдЪрд░ рдореЗрдВ println рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред


рдЕрдВрдд рдореЗрдВ, String m(int i) рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рди null рд╕рд╛рде рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ return рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ return , рдЕрд░реНрдерд╛рддреН ARETURN , рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдЖрд░рдВрднрдХрд░реНрддрд╛ рдХреЛ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред void m(int i) рдЖрдкрдХреЛ рдмрд┐рдирд╛ рд╡реИрд▓реНрдпреВ рд▓реМрдЯрд╛рдП рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдЖрд░рдВрднрдХрд░реНрддрд╛ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирдкрд┐рдЯ RETURN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдмрд╛рдпрдЯреЗрдХреЛрдб рд╕рд╣реА рд╣реИ (рдЬреЛ рдореИрдВ рд▓рдЧрд╛рддрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдИ рдмрд╛рд░ рд╕рд╣реА рдХрд░рддрд╛ рд╣реИ), рд╣рдо рдбрд┐рд╕реНрдХ рдкрд░ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред


 Files.write(new File("/tmp/SV.class").toPath(), cw.toByteArray()); 

рдФрд░ jad (Java decompiler) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдЬрд╛рд╡рд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рд╡рд╛рдкрд╕ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░реЗрдВ:


 $ jad -p /tmp/SV.class The class file version is 51.0 (only 45.3, 46.0 and 47.0 are supported) // Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: packimports(3) package edio.java.experiments; import java.io.PrintStream; // Referenced classes of package edio.java.experiments: // S, V public class SV implements S, V { public SV() { } public String m(int i) { System.out.println("String"); return null; } public void m(int i) { System.out.println("void"); } } 

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред


рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЬрдж рдХрд╛ рд╕рдлрд▓ jad рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред jad рдпреВрдЯрд┐рд▓рд┐рдЯреА рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдЖрдо рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рд░реНрдЯ рдХрд░рддреА рд╣реИ, рдлреНрд░реЗрдо рд╕рд╛рдЗрдЬ рд╕реЗ рд▓реЗрдХрд░ рд▓реЛрдХрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдорд┐рд╕рдореИрдЪ рдпрд╛ рдЧреБрдо рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рддрдХред


рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЖрдЗрдП рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ AsmClassLoader рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдпрд╣ рд╕рд┐рд░реНрдл ClassLoader.defineClass рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдЖрд╡рд░рдг рд╣реИ:


 public class AsmClassLoader extends ClassLoader { public Class defineAsmClass(String name, ClassWriter classWriter) { byte[] bytes = classWriter.toByteArray(); return defineClass(name, bytes, 0, bytes.length); } } 

рдЕрдм рдЗрд╕ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░реЗрдВ:


 ClassWriter cw = SVGenerator.generateClass(); AsmClassLoader classLoader = new AsmClassLoader(); Class<?> generatedClazz = classLoader.defineAsmClass(SVGenerator.SV_FQCN, cw); Object o = generatedClazz.newInstance(); 

рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЬреЗрдирд░реЗрдЯ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд┐рдирд╛ рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 ((S)o).m(1); ((V)o).m(1); 

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ:


 String void 

рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ: рд╣рдо рдХрдХреНрд╖рд╛ рдореЗрдВ рдЙрд╕реА (рдЬрд╛рд╡рд╛ рдмрд┐рдВрджреБ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд╛рдП рдереЗред рддреЗрдЬрд╕реНрд╡реА, рд╕рд╣реА?


рдпрджрд┐ рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдмрд╛рдпреЛрдЯреЗрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ INVOKEINTERFACE рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЗрдердб рд╣реИрдВрдбрд▓ рдХреНрд▓рд╛рд╕ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдЖрддрд╛ рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдХреЙрд▓:


 INVOKEINTERFACE edio/java/experiments/Sm (I)Ljava/lang/String; 

рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ:


 INVOKEINTERFACE edio/java/experiments/Vm (I)V 

рдЬрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╣рдордиреЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рд╕реНрдЯреИрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рд╡рд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рдмрд╣реБрд░реВрдкрддрд╛ рдХреА рд╢рдХреНрддрд┐ рд╣реИред


рдЙрд╕рдХрд╛ рдирд╛рдо рд╕реЗрддреБ рд╡рд┐рдзрд┐ рд╣реИ


рдХреЛрдИ рдкреВрдЫреЗрдЧрд╛: "рддреЛ рдЗрд╕ рд╕рдм рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдХрднреА рдХрд╛рдо рдЖрдПрдЧрд╛?"


рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдирд┐рдпрдорд┐рдд рдЬрд╛рд╡рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдПрдХ рд╣реА рдЪреАрдЬ (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░, рдЬреЗрдиреЗрд░рд┐рдХ, рдФрд░ рдЖрдВрддрд░рд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рдПрдХ рд╣реА рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:


 public interface ZeroProvider { Number getZero(); } 

рдФрд░ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:


 public class IntegerZero implements ZeroProvider { public Integer getZero() { return 0; } } 

рдЕрдм рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ:


 IntegerZero iz = new IntegerZero(); iz.getZero(); ZeroProvider zp = iz; zp.getZero(); 

iz.getZero() , рдХреЙрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИрдВрдбрд▓ рд╡рд┐рдзрд┐ ()Ljava/lang/Integer; рд╕рд╛рде INVOKEVIRTUAL рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ ()Ljava/lang/Integer; , рдЬрдмрдХрд┐ zp.getZero() рдпрд╣ рд╡рд┐рдзрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ ()Ljava/lang/Number; рд╕рд╛рде INVOKEINTERFACE рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ ()Ljava/lang/Number; ред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрд╡реАрдПрдо рдирд╛рдо рдФрд░ рд╡рд┐рдзрд┐ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЙрд▓ рднреЗрдЬрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрди 2 рдХреЙрд▓реЛрдВ рдХреЛ IntegerZero рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдореЗрдВ рд░реВрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдзрд┐ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реЗрддреБ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдирд╛рдо рдкреБрд▓ рд╡рд┐рдзрд┐ рд╣реИред рдпрджрд┐ рдпрд╣ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдЕрдВрддрд┐рдо рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:


 public class IntegerZero implements ZeroProvider { public Integer getZero() { return 0; } // This is a synthetic bridge method, which is present only in bytecode. // Java compiler wouldn't permit it. public Number getZero() { return this.getZero(); } } 

рдЕрдВрддрднрд╛рд╖рдг


рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдФрд░ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╛рдо рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рд╣реИ рдФрд░ рдЬреЗрд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рд╣реИ, рдЙрдирдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реИрдВред рдЬреЗрд╡реАрдПрдо рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЬреЗрд╡реАрдПрдо-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЬрд╛рд╡рд╛ рдФрд░ рдЙрд╕рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ рдЬреЗрд╡реАрдПрдо рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред


рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ


рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЪрд┐рдВрддрд┐рдд рдХрд░рдиреЗ рд▓рдЧрддреА рд╣реИрдВред рдореВрд▓ рд▓реЗрдЦ рдЬрд╛рд╡рд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рдирд┐рд╣рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдЗрд╕рдХреЗ рдЬрд╛рджреВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдкрд░ рдЫреБрдЖ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо, рд╕реАрдпреВрдмреАрдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рдлреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реАрдзреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдордиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдпреЗрдХрд╛рддреЗрд░рд┐рдирдмрд░реНрдЧ рдореЗрдВ JUG рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА "рдПрдкреАрдЖрдИ рдХреНрд░реЙрд╕рд┐рдВрдЧ рдкрд░ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ - рдПрдХ рд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ", рдмреИрдардХ рдХрд╛ рд╡реАрдбрд┐рдпреЛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


Source: https://habr.com/ru/post/hi426419/


All Articles