package com.kingston.hotswap;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.lang.instrument.ClassDefinition;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Field;

/**
 * agent代理
 * 
 * @author kingston
 */
public class MyAgent {

	public static void agentmain(String args, Instrumentation inst)
	{
		Class<?> c = null;
		try
		{
			c = Class.forName("com.kingston.hotswap.HotSwapUtil");
		}
		catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}
		try
		{
			StringBuilder sb = new StringBuilder();
			sb.append(args).append("\n");
			File f = new File(args);
			byte[] targetClassFile = new byte[(int)f.length()];
			DataInputStream dis = new DataInputStream(new FileInputStream(f));
			dis.readFully(targetClassFile);
			dis.close();

			DynamicClassLoader myLoader = new DynamicClassLoader();
			Class targetClazz = myLoader.findClass(targetClassFile);
//			sb.append("目标class全路径" + targetClazz.getName()).append("\n");

			ClassDefinition clazzDef = new ClassDefinition(Class.forName(targetClazz.getName()), targetClassFile);
			inst.redefineClasses(new ClassDefinition[] { clazzDef });

			sb.append("重新定义" + args + "完成");

			Field field = c.getField("log");
			field.set(null, sb.toString());
		}
		catch (Exception e)
		{
			Field field = null;
			try
			{
				field = c.getField("exception");
				field.set(null, e);
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}
		}
	}

	private static void reloadClass(File f, Instrumentation inst) throws Exception {
		byte[] targetClassFile = new byte[(int) f.length()];
		DataInputStream dis = new DataInputStream(new FileInputStream(f));
		dis.readFully(targetClassFile);
		dis.close();

		DynamicClassLoader myLoader = new DynamicClassLoader();
		Class<?> targetClazz = myLoader.findClass(targetClassFile);
		System.err.println("目标class类全路径为" + targetClazz.getName());
		ClassDefinition clazzDef = new ClassDefinition(Class.forName(targetClazz.getName()), targetClassFile);
		inst.redefineClasses(clazzDef);

		System.err.println("重新定义" + targetClazz.getName() + "完成!!");
	}
}