欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个简单的Java反编译实例

程序员文章站 2022-05-28 19:12:28
...
1、目标对象
package com.leiht.reflect.decompile;

public class Entity {
	public void method1() {
		System.out.println("-------------Method1-----------");
	}
	public void method2(String str) {
		System.out.println("-------------Method2-----------" + str);
	}
}


2、反编译实现类
package com.leiht.reflect.decompile;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ClassLoaderExpand extends ClassLoader {
	
	public Class<?> getClass(String classFileName, String className) {
		byte[] data = loadClassData(classFileName);
		Class<?> clazz = this.defineClass(className, data, 0, data.length);
	    return clazz;
	}
	
	/*
	 * 读取xxxx.clsss文件为byte[]数组
	 */
	private byte[] loadClassData(String classFileName) {
		
		FileInputStream fis = null;
		byte[] result = null;
		ByteArrayOutputStream bos = null;
		try{
			fis = new FileInputStream(new File(classFileName));
			bos = new ByteArrayOutputStream();
			int i;
			while((i = fis.read()) != -1) {
				bos.write(i);
			}
			result = bos.toByteArray();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			if(fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		return result;
	}
}


3、测试类
package com.leiht.reflect.decompile;

import java.lang.reflect.Method;

public class ClassLoaderExpandTest {
	public static void main(String[] args) throws Exception {
		ClassLoaderExpand cle = new ClassLoaderExpand();

		String classFileName = "D:\\J2SEProject\\Reflect\\bin\\com\\leiht\\reflect\\decompile\\Entity.class";
		
		//测试了一下,不传这个className也没问题
		String className = "com.leiht.reflect.decompile.Entity";
		
		Class<?> clazz = cle.getClass(classFileName, className);
		
		System.out.println(clazz);
		
		Method method1 = clazz.getMethod("method1");
		Method method2 = clazz.getMethod("method2", String.class);
		
		method1.invoke(clazz.newInstance());
		method2.invoke(clazz.newInstance(), "雷洪太");
	}
}