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

下次再完成剩下

java反编译获取源码的更多相关文章

  1. 检测微信小程序是否被反编译获取源码

    众所周知,微信小程序的代码安全性很弱,很容易被别人反编译获取源码.我自己的小程序也被别人反编译拿到源码还上线了,非常无语. 既然客户端不好防范,服务端还是可以做点手脚的. 小程序的Referer是不可 ...

  2. Android反编译获取源码-android学习之旅(70)

    上一讲我们介绍了如何获取资源文件,这一节讲解如何获取源码,其实获取源码真的很简单 首先还是要有工具,Dex2jar,这个工具用于将apk解压之后的dex文件转化为jar文件还有jd-gui的这个工具能 ...

  3. Android反编译调试源码

    Android反编译调试源码 1. 反编译得到源码 直接在windows 命令行下输入命令java -jar apktool_2.0.0.jar d -d 小米运动_1.4.641_1058.apk ...

  4. VS反编译查看源码时,会把类实现的所有接口都直接显示

    今天在看ArrayList,发现一个很有意思的问题.从VS里反编译看,ArrayList继承了ICollection. IEnumerable.IList和ICloneable,而IList又继承了I ...

  5. 一、Vs2019扩展多了 导航到反编译的源码中运行

    一.导航到反编译的源码中运行

  6. vue项目打包后使用reverse-sourcemap反编译到源码(详解版)

    首先得说一下,vue项目中productionSourceMap这个属性.该属性对应的值为true|false.   当productionSourceMap: true,时: 1.打包后能看到xxx ...

  7. java项目反编译获得源码

    经常能找到一些 过时的 项目源码,但是还是有研究价值的.但是肯定是不会给你源码的. 下面介绍怎么反编译: 1.在项目中找到classes这个文件夹,这个就是编译过的文件. 2.下载反编译工具JD-GU ...

  8. Android:反编译查看源码

    下载>>>>>>>>>>>>>>> 使用图形化反编译工具:Androidfby 打开Androidfby中的A ...

  9. 如何使用ILSpy 把发布版本反编译成源码

    有时候,看法别人写的代码比较好,想看看他们的代码到底是如何写的,于是就找方法,看看能否把发布版本变成源码.后来终于发现一个词“反编译”,我终于知道怎么办了. 工具:ILSpy   百度下载一个,该工具 ...

随机推荐

  1. 2016苹果春季发布会 iPhone SE发布

    配置如下 主屏尺寸:4英寸 主屏分辨率:1336x640像素 后置摄像头:1200万像素 前置摄像头:120万像素 电池容量:1624mAh 核心数:双核 操作系统:iOS 9 核心数:双核 CPU: ...

  2. Eclipse启动参数

    from 网络 eclipse 启动参数 -clean2013-- : eclipse 启动参数介绍(如添加插件时,如果不显示,则使用eclipse -clean启动) 其实,Eclipse是一个可以 ...

  3. iOS 代码规范

    1 目的 统一规范XCode编辑环境下Objective-C.swift的编码风格和标准 2 适用范围 适用于所有用Objective-C,swift语言开发的项目. 3 编码规范 3.1 文件 项目 ...

  4. C#设计模式-建造者模式

    在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由C ...

  5. iOS开发-应用崩溃日志揭秘(一)

    作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...

  6. 【夔堂】:程序血泪史之——有一种垃圾语言叫做JavaScript

    "Prototype"机制是个半成品OOP,有些文章说这玩意当初为了"简单(编写).容易(学习)"而发明的,但web前端技术发展到今天我们看到,JS显然是需要O ...

  7. WPF 子窗体关闭,刷新父窗体

    父窗体代码 private void DGUserEdit() { if(DGUser.SelectedItem!=null) { DataRow dr = (DGUser.SelectedItem ...

  8. EF循环迭代导致如此严重的性能丢失,你知道?

    前言 在工作当中呢,没怎么用到过EF,所以为了遗忘这一部分知识,偶尔会去写写小的demo,偶然机会在EF循环迭代中发现居然影响性能这么严重,当我们在用时或许大概也许可能都曾这样写过,但是你注意到了吗, ...

  9. CSS字体记录

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaYAAACnCAIAAADVOG9FAAAgAElEQVR4nOy9eXwcxZk/vL/9ve8eb7 ...

  10. 深入seajs源码系列一

    简述 前端开发模块化已经是大势所趋,目前模块化的规范有很多,众所周知的有commonJS,Module/Wrappings和AMD等,而且ES6也着手开始制定模块化机制的实现.类似于c/c++的inc ...