рддрдХрдиреАрдХреА рдкрджреЛрдВ рдкрд░ рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рдПрдХ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ 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);
рдЖрдЗрдП 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;
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред
рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЬрдж рдХрд╛ рд╕рдлрд▓ 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; }
рдЕрдВрддрднрд╛рд╖рдг
рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдФрд░ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдирд╛рдо рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рд╣реИ рдФрд░ рдЬреЗрд╡реАрдПрдо рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рд╣реИ, рдЙрдирдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рд╣реИрдВред рдЬреЗрд╡реАрдПрдо рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЬреЗрд╡реАрдПрдо-рдЖрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЬрд╛рд╡рд╛ рдФрд░ рдЙрд╕рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ рдЬреЗрд╡реАрдПрдо рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред
рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ
рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЪрд┐рдВрддрд┐рдд рдХрд░рдиреЗ рд▓рдЧрддреА рд╣реИрдВред рдореВрд▓ рд▓реЗрдЦ рдЬрд╛рд╡рд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рдирд┐рд╣рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдЗрд╕рдХреЗ рдЬрд╛рджреВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдкрд░ рдЫреБрдЖ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо, рд╕реАрдпреВрдмреАрдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рдлреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реАрдзреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдордиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдпреЗрдХрд╛рддреЗрд░рд┐рдирдмрд░реНрдЧ рдореЗрдВ JUG рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА "рдПрдкреАрдЖрдИ рдХреНрд░реЙрд╕рд┐рдВрдЧ рдкрд░ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ - рдПрдХ рд╕реНрдерд┐рд░ рдПрдкреАрдЖрдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ", рдмреИрдардХ рдХрд╛ рд╡реАрдбрд┐рдпреЛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред