最近在研究反射,想做一個東西,把運行的java程序飯編譯(Decompile)成.java文件。現思路如下:
1.寫出程序反編譯一個類
2.將所有類反編譯
3.java代碼注入一個正在運行的java程序中
現已實現第一步:
代碼如下:
//這是一個要反編譯的類
public class Reflect { private int num; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getString() { return string; } public void setString(String string) { this.string = string; } private String string; public void printProperty(){ System.out.println(getNum()); System.out.println(string); } public void println(String s){ System.out.println(s); } }
//實現反編譯的類,現在可以判斷具體有哪些方法,但是方法里面的具體細節還不能輸出
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Parameter; public class Decompile { private Class<?> c; private Reflect reflect; private String className; public Decompile(String className){ try { this.className = className; c = Class.forName(className); reflect=(Reflect)c.newInstance(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //獲得構造方法 public void getConstructFuntion(){ Constructor[] constructors = c.getConstructors(); for(Constructor constructor:constructors){ System.out.println( Modifier.toString(constructor.getModifiers()) +" " +constructor.getName() +"(" +getParameter(constructor) +"){}"); } } //獲得類信息 public void getClassInfo(){ try { System.out.println( Modifier.toString(c.getModifiers()) +" class" +className +"{"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //獲得類屬性信息 public void getProperty(){ Field[] fields = c.getDeclaredFields(); for(Field field:fields){ field.setAccessible(true); try { System.out.println( Modifier.toString(field.getModifiers()) +" " +field.getType().getSimpleName() +" " +field.getName() +" = " +field.get(reflect) +";"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //獲得類方法信息 public void getFuntion(){ Method[] methods=c.getDeclaredMethods(); for(Method method:methods){ System.out.println( Modifier.toString(method.getModifiers()) +" " +method.getReturnType().getSimpleName() +" " +method.getName().toString() +"(" +getParameter(method) +"){}"); } } //獲得參數字符串 public String getParameter(Object obj){ Parameter[] parameters=null; if("Method".equals(obj.getClass().getSimpleName())){ parameters = ((Method)obj).getParameters(); } else{ parameters = ((Constructor)obj).getParameters(); } StringBuffer sb = new StringBuffer(); int count = 0; for(Parameter parameter:parameters){ if(count!=0){ sb.append(","); } sb.append(parameter.getType().getSimpleName() +" " +parameter.getName().toString()); count++; } return sb.toString(); } }
//測試代碼
public class TestReflect { public static void main(String[] args) { Decompile decompile=new Decompile("Reflect"); decompile.getClassInfo(); decompile.getConstructFuntion(); decompile.getProperty(); decompile.getFuntion(); System.out.println("}"); } }
下次再完成剩下