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 百度下载一个,该工具 ...
随机推荐
- TODO:Node.js pm2使用方法
TODO:Node.js pm2使用方法 pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完 ...
- Html5 布局方式
在Html5之前,统一采用的是Div+css的方式进行布局,但是却和开发人员的命名方式,喜好有关.在新的Html5中,布局却显得更加人性化,更易理解了.如增加了Header,Footer,Sectio ...
- SQL Server 创建数据库邮件
一. 背景 数据库发邮件通知数据库的运行状态(状态可以通过JOB形式获取)和信息,达到预警的效果. 二. 基础知识 msdb系统数据库保存有关Job,Database Mail,Nodifyicati ...
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- UWP开发之Mvvmlight实践三:简单MVVM实例开发(图文详解付代码)
在做MVVM各种框架对比之前,我觉得有必要先自己做一个简单的MVVM实现案例比较好,这样就可以看到自己实现的时候有那些不方便的地方.而各种框架又是怎么解决我们这些麻烦的. 案例介绍:用户登录画面,没有 ...
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- 【记录】AutoMapper Project To not support ResolveUsing
示例代码: public List<OrderLineDTO> GetLinesForOrder(int orderId) { Mapper.CreateMap<OrderLine, ...
- Android ViewPager切换之PageTransformer接口中transformPage方法解析
今天让我们了解一下,Android3.0之后ViewPager切换时候的一个动画.Google给我们展示了两个动画例子:DepthPageTransformer和ZoomOutPageTransfor ...
- ZooKeeper集群搭建中的Connection refused而导致的启动失败
1. 前言 每一次搭建集群环境都像一次战斗,作战中任何一个细节的出错都会导致严重的后果,所以搭建中所需要做的配置如系统配置.网络配置(防火墙记得关).用户权限.文件权限还有配置文件等等内容,都必须非常 ...
- 【转】 个人认为,这是最详细的 android------HttpURLConnection 类用法详解。一些教材没讲到的,它讲到了
站在巨人的肩膀上,渐渐进步. 原文链接:http://www.blogjava.net/supercrsky/articles/247449.html 针对JDK中的URLConnection连接Se ...