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("}");
}
}
下次再完成剩下
java反编译获取源码的更多相关文章
- 检测微信小程序是否被反编译获取源码
众所周知,微信小程序的代码安全性很弱,很容易被别人反编译获取源码.我自己的小程序也被别人反编译拿到源码还上线了,非常无语. 既然客户端不好防范,服务端还是可以做点手脚的. 小程序的Referer是不可 ...
- Android反编译获取源码-android学习之旅(70)
上一讲我们介绍了如何获取资源文件,这一节讲解如何获取源码,其实获取源码真的很简单 首先还是要有工具,Dex2jar,这个工具用于将apk解压之后的dex文件转化为jar文件还有jd-gui的这个工具能 ...
- Android反编译调试源码
Android反编译调试源码 1. 反编译得到源码 直接在windows 命令行下输入命令java -jar apktool_2.0.0.jar d -d 小米运动_1.4.641_1058.apk ...
- VS反编译查看源码时,会把类实现的所有接口都直接显示
今天在看ArrayList,发现一个很有意思的问题.从VS里反编译看,ArrayList继承了ICollection. IEnumerable.IList和ICloneable,而IList又继承了I ...
- 一、Vs2019扩展多了 导航到反编译的源码中运行
一.导航到反编译的源码中运行
- vue项目打包后使用reverse-sourcemap反编译到源码(详解版)
首先得说一下,vue项目中productionSourceMap这个属性.该属性对应的值为true|false. 当productionSourceMap: true,时: 1.打包后能看到xxx ...
- java项目反编译获得源码
经常能找到一些 过时的 项目源码,但是还是有研究价值的.但是肯定是不会给你源码的. 下面介绍怎么反编译: 1.在项目中找到classes这个文件夹,这个就是编译过的文件. 2.下载反编译工具JD-GU ...
- Android:反编译查看源码
下载>>>>>>>>>>>>>>> 使用图形化反编译工具:Androidfby 打开Androidfby中的A ...
- 如何使用ILSpy 把发布版本反编译成源码
有时候,看法别人写的代码比较好,想看看他们的代码到底是如何写的,于是就找方法,看看能否把发布版本变成源码.后来终于发现一个词“反编译”,我终于知道怎么办了. 工具:ILSpy 百度下载一个,该工具 ...
随机推荐
- 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9 关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...
- 记一个简单的保护if 的sh脚本
真是坑爹,就下面的sh,竟然也写了很久! if [ `pwd` != '/usr/xx/bin/tomcat' ] then echo "rstall is not allowed in c ...
- Trace1:Default Trace
sql server trace 是一个轻量级的追踪工具,对追踪数据库的行为很有用,因此,sql server内置一个trace(default trace). 1,sql server 内置Defa ...
- 传智播客--高级控件--showdialog关闭(小白内容)
以往我在WPF里,用ShowDialog展示出一个页面,一般都是用Close()进行关闭. 今天看传智播客的视频时,了解到还能直接给DialogResult一个TRUE或者false的属性,使页面关闭 ...
- Hibernate注解
前言: 最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件.下面拿个小例子说一下. 数据库物理模型: 数据库的描述: 一篇博客随笔可以分到不同的类 ...
- 创建第二个 local network - 每天5分钟玩转 OpenStack(84)
GUI 中有两个地方可以创建 network: 1. Project -> Network -> Networks 这是普通用户在自己的 tenant 中创建 network 的地方. 2 ...
- Rust初步(三):使用atom搭配racer进行rust编程
在rust.cc社区中有一个关于rust编辑器的讨论(话说很多人要学一个新语言,都会立即考虑编辑器的问题,包括我在内),主要关注的是,智能提示(这个真的太重要了).大家讨论下来有几个选择 1. ecl ...
- T-Sql学习系列完结
T-Sql(一)简单语法 T-Sql(二)事务(Transaction) T-Sql(三)存储过程(Procedure) T-Sql(四)表关联和视图(view) T-Sql(五)xml操作 T-Sq ...
- Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)中一些知识点
Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Flume官方文档翻译--Flume 1.7.0 User Guide (unr ...
- C#: 向Word插入排版精良的Text Box
Text Box(文本框)是Word排版的工具之一.在Word文档正文的任何地方插入文本框,可添加补充信息,放在合适的位置,也不会影响正文的连续性.我们可以设置文本框的大小,线型,内部边距,背景填充等 ...