001package com.killcoding.jsplus; 002 003import java.io.File; 004import com.killcoding.tool.CommonTools; 005import com.killcoding.datasource.DriverDataSource; 006import java.util.Map; 007import java.util.HashMap; 008import com.killcoding.tool.FileTools; 009import java.io.StringReader; 010import java.nio.file.Path; 011import java.nio.file.Files; 012import com.killcoding.cache.CacheArray; 013import java.util.Scanner; 014import java.nio.file.Paths; 015import com.killcoding.tool.ConfigProperties; 016import com.killcoding.jsplus.GhostConsole; 017import net.bytebuddy.agent.ByteBuddyAgent; 018import java.lang.instrument.ClassFileTransformer; 019import java.security.ProtectionDomain; 020import java.net.URLEncoder; 021import java.nio.charset.StandardCharsets; 022 023public final class MainAgent { 024 025 public MainAgent(){ 026 super(); 027 } 028 029 protected static long mainAgentClassCurrentIndex = 0; 030 protected static String mainAgentClassMatches = null; 031 protected static String mainAgentClassExportIndex = null; 032 protected static String mainAgentClassExportPath = null; 033 034 public static void main(String[] args){ 035 ByteBuddyAgent.install(); 036 mainAgentClassMatches = System.getenv("MainAgentClassMatches") + ""; 037 mainAgentClassExportIndex = System.getenv("MainAgentClassExportIndex") + ""; 038 mainAgentClassExportPath = System.getenv("MainAgentClassExportPath"); 039 040 System.out.println("MainAgentClassMatches: " + mainAgentClassMatches); 041 System.out.println("MainAgentClassExportIndex: " + mainAgentClassExportIndex); 042 System.out.println("MainAgentClassExportPath: " + mainAgentClassExportPath); 043 System.out.println("MainAgentClassExportPath using default (e.g. CurrentFolder/javaClasses)"); 044 045 ByteBuddyAgent.getInstrumentation().addTransformer(new ClassFileTransformer() { 046 @Override 047 public byte[] transform(ClassLoader loader, String className, 048 Class<?> classBeingRedefined, 049 ProtectionDomain protectionDomain, 050 byte[] classfileBuffer) { 051 052 if (className != null && className.matches(mainAgentClassMatches)) { 053 saveBytecode(className, classfileBuffer); 054 } 055 return classfileBuffer; 056 } 057 058 private void saveBytecode(String className, byte[] bytes) { 059 if(mainAgentClassExportPath == null){ 060 mainAgentClassExportPath = ScriptConsole.getJsPlusPath() + "/javaClasses/"; 061 } 062 try { 063 String classFileName = URLEncoder.encode(className.replace('/', '.'), StandardCharsets.UTF_8.toString()); 064 if(mainAgentClassExportIndex.equals("true")){ 065 classFileName = mainAgentClassCurrentIndex + "_" + classFileName; 066 } 067 Path path = Paths.get(mainAgentClassExportPath,classFileName + ".class"); 068 Files.createDirectories(path.getParent()); 069 Files.write(path, bytes); 070 } catch (Exception e) { 071 e.printStackTrace(); 072 }finally{ 073 mainAgentClassCurrentIndex++; 074 } 075 } 076 }); 077 078 Main.appMain(args); 079 } 080 081}