рдПрдирдХреНрд░рд┐рдкреНрдЯреЗрдб? JVM рд╕реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдмрд╛рд╣рд░ рдЦреАрдВрдЪреЛ



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

рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ


рд╕рд░реНрд╡рд░ рдХреЛрд░ (рдЬрд╛рд░) рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрд░рд╕реА 4 рд╕реНрдЯреНрд░реАрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рд░рд╣рд╛ред рд╡рд░реНрдЧ рдХреЛ рдЕрдкрдШрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдпрд╛ рддреЛ рдбрд┐рдХрдореНрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдВрдд рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рдпрд╛ рдпрд╣:

рдЫрд╡рд┐

рдЗрд╕ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рд╣рд╛рдБ, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдоред рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рдж рдХреЛ рдЕрдХреНрд╕рд░ * рдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреАрдд рдФрд░ рдирд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред рдХреНрд▓рд╛рд╕рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдбрд┐рдлреЗрдВрд╕рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЗрдПрдирдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрд╢реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдбрд┐рдлреЗрдВрд╕рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдмрд╛рдИрдЯреЗрдХреЛрдб рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рддреИрдпрд╛рд░ рд╡рд░реНрдЧ рдЬреЗрд╡реАрдПрдо рдХреЛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдХрдИ рд╕рдорд╛рдзрд╛рди рдереЗ: рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╣реБрдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛, рдУрдкрди-рдЬреЗрдбрдбреАрдХреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪрдирд╛ред рдореИрдВрдиреЗ Google рд╕реЗ рдкреВрдЫрд╛ рдХрд┐ рдХреНрдпрд╛ рдЬреЗрд╡реАрдПрдо рд╕реЗ рд╕реАрдзреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдХреНрд░рд┐рдкреНрдЯреЗрдб рдмрд╛рдпреЛрдЯреЗрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рдереЗред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдФрд░ рдЕрджреНрднреБрдд рд╡рд░реНрдЧ java.lang.instrument.Instrumentation рд╣реИ, рдЬреЛ рдПрдЬреЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд▓рдЧреНрди рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рдЗрд╕рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХрд╛ рд╣реИ retransformClasses (рдХрдХреНрд╖рд╛ [рдХрдХреНрд╖рд╛рдПрдВ))ред рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдФрд░ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, ClassFileTransformer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException 


рдпреВрд░реЗрдХрд╛! рдмрд╛рдЗрдЯ [] classfileBuffer - рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП! рдпрд╣ рдХрдХреНрд╖рд╛ рдХрд╛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯреЗрдб рдмрд╛рдпрдЯреЗрдХреЛрдб рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕реЗ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред

 try { className = className.replace("/", File.separator); StringBuilder buf = new StringBuilder(); buf.append(dumpDir); buf.append(File.separatorChar); int index = className.lastIndexOf(File.separatorChar); if (index != -1) buf.append(className.substring(0, index)); String dir = buf.toString(); new File(dir).mkdirs(); String fileName = dumpDir + File.separator + className + ".class"; FileOutputStream fos = new FileOutputStream(fileName); fos.write(classBuf); fos.close(); } catch (Exception exp) { exp.printStackTrace(); } 


рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рдЧрд╛рд╡ рдХреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 public static void agentmain(String agentArgs, Instrumentation inst) { inst.addTransformer(new ClassFileTransformerImpl(), true); inst.retransformClasses(inst.getAllLoadedClasses()); //       } 


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

рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП!


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд░рдирд┐рдВрдЧ jvm рдХреЗ рд╕рднреА рдкреАрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ com.sun.tools.attach.VirtualMachine.list () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ jvm рдЪрд▓рд╛рдиреЗ рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛ рджреАред рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдЬреАрдпреВрдЖрдИ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдЬреЗрд╡реАрдПрдо рдФрд░ рдкреНрд░реЛрд╕реЗрд╕ рдЖрдИрдбреА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдмреБрд░реА рд╣реИ, рдмрд╕ рдИрд╢реНрд╡рд░реАрдп рд╕реНрдореГрддрд┐ рдХреЛ рдЦрд╛ рдЬрд╛рддреА рд╣реИред рд╣рд╛рдВ, рдФрд░ рдПрдХ рдЕрддрд╛рд░реНрдХрд┐рдХ рддрд░реАрдХрд╛, рдПрдХ рд╡рд┐рдзрд┐ рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ, рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ред рдФрд░ рдореИрдВрдиреЗ рдорд╛рдирдХ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреА рдУрд░ рд░реБрдЦ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ jdk рдХрд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд▓рд┐рд╕рдирд░ рдкрд╛рдпрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдерд╛, рдФрд░ рдпрд╣реА рд╣реБрдЖред

 import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.event.HostEvent; import sun.jvmstat.monitor.event.HostListener; import sun.jvmstat.monitor.event.VmStatusChangeEvent; public class VMUpdater { public static MonitoredHost MH; public VMUpdater() { try { MH = MonitoredHost.getMonitoredHost("localhost"); MH.addHostListener(new HostListenerAction()); } catch (Exception e) {} } private class HostListenerAction implements HostListener { @Override public void vmStatusChanged(VmStatusChangeEvent vmStatusChangeEvent) {} @Override public void disconnected(HostEvent hostEvent) {} } } 


VmStatusChanged рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо GUI рдЕрджреНрдпрддрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рд▓рдХреНрд╖реНрдп рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдЬреЗрдВрдЯ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВред

 private static final String PATH = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); private static VirtualMachine vm; //   pid ,    GUI public static void attach(int pid) throws Exception { vm = VirtualMachine.attach(String.valueOf(pid)); vm.loadAgent(PATH); //  jar c  (  ,  ) AttachedGUI.getInstance().draw(); // GUI } 


рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЬрд╛рд░ рдХреА рдПрдХ рд╕рдЯреАрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╣рдо рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред GUI рдореЗрдВ, рдЬрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЙрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдиреЗ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓, рдЖрд░рдПрдордЖрдИ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛ред
рдкрде рдЬрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЗрдирд╕рд╛рдЗрдЯреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ! рдФрд░ рддреБрдо рдмрд┐рд▓рдХреБрд▓ рдареАрдХ рд╣реЛ рдЬрд╛рдУрдЧреЗред рд╣рдо рдЕрдкрдиреЗ рдХреНрд▓рд╛рд╕ рд▓реЛрдбрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЬрд╛рд░ рд╕реЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдордЬрдмреВрд░ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЛ рджреЗ рджреЗрдЧрд╛, рдЬреЛ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдвреЗрд░ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВрдЧреЗред

 import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.Hashtable; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class JarClassLoader extends ClassLoader { private Hashtable<String, Class<?>> classes = new Hashtable<String, Class<?>>(); public JarClassLoader(ClassLoader parent) { super(parent); } @Override public synchronized Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException { Class<?> result = null; result = classes.get(className); if(result == null) result = super.findSystemClass(className); if(result == null) result = super.loadClass(className); classes.put(className, result); return result; } public Hashtable<String, Class<?>> loadJar(String jarPath, String dumpPath) throws IOException, ClassNotFoundException { classes.clear(); JarFile jar = new JarFile(jarPath); Enumeration<JarEntry> entries = jar.entries(); while (entries.hasMoreElements()) { String name = entries.nextElement().getName(); if(name.endsWith(".class")) { String className = name; if(name.contains(".")) className = name.substring(0, name.lastIndexOf(".")).replace("/", "."); Class<?> c = loadClass(className); if(c != null) classes.put(className, c); } else if(jar.getEntry(name).isDirectory()) { name = slash2sep(name); new File(dumpPath + File.separator + name).mkdirs(); } else { FileOutputStream fos = new FileOutputStream(dumpPath + File.separator + name); BufferedInputStream bis = new BufferedInputStream(jar.getInputStream(jar.getEntry(name))); byte[] data = new byte[(int) jar.getEntry(name).getSize()]; bis.read(data); fos.write(data); bis.close(); fos.close(); } } jar.close(); return classes; } private static String slash2sep(String src) { int i; char[] chDst = new char[src.length()]; String dst; for(i = 0; i < src.length(); i++) { if(src.charAt(i) == '/') chDst[i] = File.separatorChar; else chDst[i] = src.charAt(i); } dst = new String(chDst); return dst; } } 


рдпрджрд┐ рд╣рдо рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдХрд░реЗрдЧрд╛ (рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рднреА gui рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ, рдкреИрд░рд╛рдореАрдЯрд░ rmi рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ)ред

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

 Premain-Class: ClassDumperAgent Agent-Class: ClassDumperAgent Can-Redefine-Classes: true Can-Retransform-Classes: true 


рдЦреИрд░, рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗред рдкреВрд░реЗ рдЬрд╛рд░ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рд▓реЗрдХрд┐рди рдкреИрдХреЗрдЬ рдФрд░ рдЕрдЪреНрдЫреЗ рдЪрд┐рдкреНрд╕ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рдЫрд╡рд┐
рдЫрд╡рд┐

рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ

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


All Articles