java反编译获取源码

最近在研究反射,想做一个东西,把运行的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("}"); } }

下次再完成剩下

转载于:https://www.cnblogs.com/yzjT-mac/p/5910742.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: jar文件是Java语言中常见的一种打包文件格式,它将多个Java类文件、资源文件和其他文件打包成一个文件。一般情况下,jar文件是已经编译成机器码的二进制文件,无法直接查看其中的源代码。但是,通过使用反编译工具,我们可以将jar文件中的字节码还原成Java源代码。 在进行jar文件反编译时,我们通常会使用一些专门的反编译工具,如Java Decompiler、JD-GUI等。这些工具能够将jar文件中的字节码重新转换成Java源代码,并呈现给我们查看和分析。 使用这些反编译工具,我们可以对jar文件中的代码进行查看、修改和学习。例如,我们可以查看第三方库的源码,了解其实现原理;或者对某个jar文件进行定制修改,以适应特定需求。 需要注意的是,虽然反编译可以还原代码的结构和逻辑,但无法还原原始的变量名和注释。这是因为在编译过程中,Java源代码的变量名和注释会被编译器丢弃,只保留了与机器码执行有关的信息。因此,在反编译后的代码中,我们可能会看到一些类似"var1"、"var2"这样的临时变量名,而注释则可能被省略或被替换成了一些默认的注释。 总之,通过反编译jar文件,我们可以获取到其中的Java源代码,从而进行代码的分析和修改。这对于学习和项目调试等方面都起到了重要的作用。 ### 回答2: jar文件是一种Java语言的归档文件格式,可以将多个Java类文件打包成一个文件。反编译指的是将已经编译过的二进制文件(如jar文件)转换回可读的源代码。 要反编译一个jar文件中的Java源码,我们可以使用各种反编译工具,例如JD-GUI、Java Decompiler、FernFlower等。 首先,我们需要将jar文件导入到反编译工具中。这些工具通常提供一个用户界面,让我们可以轻松地导入并查看jar文件的内容。在工具的界面上,我们可以看到jar文件中包含的类文件和资源文件的列表。 接下来,我们可以选择一个或多个类文件,并使用反编译工具将其转换成可读的Java源码。这些工具通常会将反编译后的源代码显示在一个编辑器或浏览器窗口中,使我们能够查看和编辑源代码。 需要注意的是,由于编译后的二进制文件丢失了一些原始代码的信息(如变量和方法名),所以反编译后的源码可能不会与原始源代码完全相同。此外,反编译后的源码可能也会缺少一些编译器优化后的改进。 总结起来,jar文件反编译Java源码是一种将已编译的二进制文件转换回可读的源代码的过程。通过使用反编译工具,我们可以将jar文件中的类文件转换成可读的Java源码,以便于我们查看和编辑源代码。但需要注意的是,反编译后的源码可能与原始源代码存在一些差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值