我工作的地方,我们正在做大量的Java服务和客户用其它各种语言之间的远程对象转移的项目.鉴于我们目前的限制,我已经决定要看看它会采取基于现有的Java类代码.基本上,我需要一个.class文件(或它们的集合)解析字节码,以确定所有的数据成员,或许getter/setter方法,然后写的东西,可以在不同的语言输出的代码来创建一个类具有相同的结构.
我不是在寻找像JAD这样的标准反编译器.我需要能够获取.class文件并创建其数据成员和方法的对象模型.这有可能吗?
为什么python在解释之前将源代码编译为字节码?
为什么不直接从源头解释?
我想知道为什么我们从编译.c文件得到的.o文件打印出"Hello,World!" 大于Java .class文件,也打印"Hello,World!"?
如何使用Python 2.7重新编译Python 2.5生成的一些.pyc文件?
我没有源文件,我无法获取它.
我正在寻找一个免费的解决方案.
我正在编写一个游戏引擎/库,其中我有一个事件调度程序类,它通过调用"已注册"事件处理程序类的侦听器方法来调度事件.可以通过调用适当的调度程序方法向事件调度程序注册事件处理程序/侦听器.
这显然会导致一些样板代码用于注册每个事件处理程序(以及我的引擎的其他方面都有类似的bolierplate代码),所以我想知道 - 如何在加载事件处理程序期间使用Instrumentation添加所有必需的代码class,因此编码时不需要事件调度程序的显式注册 - 在程序运行时自动添加对调度程序寄存器方法的调用.
我的理解是,为了使用Instrumentation,应该使用一些字节码修饰符API.我知道两个 - ASM和BCEL.我应该使用哪一个?显然,这是我想要做的一个简单的任务,所以我想要一个更容易学习和更好记录的那个.
编辑:这是一个具体的例子.
原始事件处理程序类:
@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
//hidden default constructor
public void handleEvent(MouseEvent event)
{ ... }
}
Run Code Online (Sandbox Code Playgroud)
改造后:
@Handler
public class MouseEventHandler implements EventHandler<MouseEvent>
{
public MouseEventHandler()
{
//add this line of code to default constructor
Game.getEventDispatcher().addEventHandler(this);
}
public void handleEvent(MouseEvent event)
{ ... }
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个字节码分析项目,我正在使用ASM.一切都很顺利,我能够成功解析,获得类和方法信息.
但我坚持理解泛型的字节码表示.下面是一个例子java.util.list,当我使用visitMethod从ClassVisitor打印的信息,这是我得到的方法的签名之一:
(ILjava/util/Collection<+TE;>;)Z
Run Code Online (Sandbox Code Playgroud)
在这里,我试图逐个反汇编并理解方法的参数:
I 代表intLjava/util/Collection 代表它是一种类型的论证 Collection但我被困在仿制药类型<+TE>等等.任何人都可以指导我吗?我试图搜索但没有得到足够的信息.如果有人有字节码名称列表,请分享一下吗?
我正在读一本书"Beginning Java 8 Fundamentals".我看到了这一行:
//some code...
sum = sum + i; // Better to use sum += i
//more code...
Run Code Online (Sandbox Code Playgroud)
那么这是我的疑问:这是真的吗?为什么更好地使用+=运营商?我认为+=运算符只是一个更简化的表达式?如果我使用代码性能中的一个或其他含义?
我今天进行了以下升级
在 build.gradle
依赖项{classpath'com.android.tools.build:gradle:3.0.1 ' - > 3.1.0 }
在 gradle/wrapper/gradle-wrapper.properties
distributionUrl = https://services.gradle.org/distributions/ gradle-4.5-all.zip - > gradle-4.6-all.zip
我现在正在使用我的firebase模块跟踪错误(我构建时的随机模块)
无法找到com/google/firebase/storage/StreamDownloadTask $ StreamProcessor的字节代码
或者有时候
无法找到com/google/firebase/database/ChildEventListener的字节代码
我的项目实施
dependencies {
compile 'com.google.android.gms:play-services-base:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'
compile 'com.google.firebase:firebase-auth:11.8.0'
compile 'com.google.firebase:firebase-firestore:11.8.0'
compile 'com.google.firebase:firebase-invites:11.8.0'
compile "com.google.firebase:firebase-messaging:11.8.0"
compile 'com.google.android.gms:play-services-auth:11.8.0'
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:26.1.0'
}
Run Code Online (Sandbox Code Playgroud) 很可能是一个愚蠢的问题,因为我对Java/Jython/JRuby /字节码不太了解,但..
今天我偶然发现了_why的邪恶 ......它允许你从Ruby代码输出Python字节码.基本上允许它们生成相同的字节码..
Jython输出Java字节码,就像JRuby一样.由于这些都编译为相同的字节码,这是否意味着您可以使用Ruby中的任何Python库和Python中的Ruby库?
我一直在使用Javassist在加载类时动态操作类.虽然使用Javassist向代码添加代码相对容易,但我还是找不到删除代码的方法.
这时我通过使用nop指令来替换目标操作码和任何参数来模拟代码的删除.但是,我认为这主要是一个黑客攻击:
每个操作码必须单独处理,因为参数的字节长度不同.在某些情况下,我还需要在nop和pop之间进行选择,具体取决于删除的操作码是否影响堆栈.这种操作开始变得乏味 - 并且执行它的代码变得相当复杂.所以,当然,我希望有一个现有的解决方案.
最终结果充满了nop指令.虽然JVM应该优化那些没有性能影响,但结果字节码仍然非常不优雅,并且应该比它更大.这更像是一个美学问题,但它仍然需要考虑.
不幸的是,仅仅移动字节码数组的部分来填补空白是不够的 - 任何对移动代码的引用(例如分支指令索引)也应该更新.
是否可以使用Javassist删除指令?或者,是否有一个字节码操作库,可以让我轻松地做到这一点,而不必自己解析字节码?