一个简单的Java反编译实例
程序员文章站
2022-05-28 19:12:28
...
1、目标对象
2、反编译实现类
3、测试类
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(), "雷洪太"); } }
下一篇: java如何反射调用静态方法