最近在研究反射,想做一个东西,把运行的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. EF:Fluent API 把一对多映射为一对一

    假设有两张表:A表和B表.A表与B表在数据库中的关系是一对多,但我们需要在EF中映射为一对一. 首先在A实体类和B实体类中互相为对方增加一个实体类的属性: public A { public B B ...

  2. ORA-12899: value too large for column (actual: 27, maximum: 20)

    导入数据时报错以下错误,这是因为原来的数据库是GBK的,每个汉字两个字节,但新数据库是UTF-8的,每个汉字是三个字节,导致超过长度了. ORA-12899: value too large for ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (23) -----第五章 加载实体和导航属性之预先加载与Find()方法

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-2  预先加载关联实体 问题 你想在一次数据交互中加载一个实体和与它相关联实体. ...

  4. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹

    摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...

  5. Leetcode-463 Island Perimeter

    #463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...

  6. 《Qt Quick 4小时入门》学习笔记4

    http://edu.csdn.net/course/detail/1042/14806?auto_start=1 Qt Quick 4小时入门 第七章:处理鼠标与键盘事件 1.处理鼠标事件 鼠标信号 ...

  7. OpenCASCADE Performance Test

    OpenCASCADE Performance Test eryar@163.com Abstract. Use the Draw Test Harness to test the performan ...

  8. TSQL语句

    1.创建数据库create database test3;2.删除数据库drop database test3;3.创建表create table test(    code varchar(20), ...

  9. 虚拟化 - 每天5分钟玩转 OpenStack(2)

    OpenStack是云操作系统,要学习OpenStack,首先需要掌握一些虚拟化和云计算的相关知识. 虚拟化 虚拟化是云计算的基础.简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享 ...

  10. Android随笔之——PackageManager详解

    参考:http://www.cnblogs.com/xingfuzzhd/p/3374504.html 今天要讲的是PackageManager.Android系统为我们提供了很多服务管理的类,包括A ...