我想用Java字节码编写一个简短的程序(也许是一个Hello World).我只想用文本编辑器编写字节码并运行它.我该怎么做?有一个例子吗?谢谢!
是否有用于编辑java类文件的实用程序(或eclipse插件)?我想操纵java类文件的字节码而不重新编译它,也没有完整的构建路径.
例如,重命名方法,添加/删除指令,更改常量等.
我找到的唯一工具是:
我正在使用Java进行字节码操作/生成,我只是想知道是否有一种简单的方法可以检查字节码.我不想反编译文件,我想实际查看编译后的字节码.我不需要编辑它.任何用于执行此操作的链接或程序都是可接受的答案.
我正在开发一个 android 库,我想隐藏它的代码。我正在使用其他库,对于其中一些库,当尝试使用 Android Studio 访问他们的代码时,您只能获得类的方法列表和“/ * 编译代码* /”。我正在使用 pro-guard,但我仍然可以访问我的库的源代码。即使修改了方法和成员名称,代码仍然是可读的,并且可以读取每个硬编码的字符串。
如何以与这些库相同的方式隐藏我的代码?
今天我只是尝试在编译的java类文件中使用操作码.插入后
iinc 1,1
Run Code Online (Sandbox Code Playgroud)
java虚拟机响应:
Exception in thread "main" java.lang.ClassFormatError: Truncated class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: Test. Program will exit.
Run Code Online (Sandbox Code Playgroud)
这是我的示例源代码:
public class Test {
public static void main(String[] args) {
int i = 5;
i++;
i++;
i++;
System.out.println("Number: " + i + "\n");
}
}
Run Code Online (Sandbox Code Playgroud)
对于操作数,增量的操作码是0x84 + 2个字节.结果类文件中只有一个部分,其中包含0x84:
[..] 8401 0184 …Run Code Online (Sandbox Code Playgroud) 说我有这个String表达
String hi = "Tom" + "Brady" + "Goat"
Run Code Online (Sandbox Code Playgroud)
我知道字符串池"允许运行时通过在池中保留不可变字符串来节省内存" 字符串池
字符串池中将创建多少个字符串?
我最初的猜测是5 - ,"Tom","Brady","Goat","TomBrady","TomBradyGoat"因为操作顺序的String级联(左到右?),或者是它只是最后的结果,"TomBradyGoat",存储在字符串池?
我有这个 ClassParent 类
class ClassParent<T> {
public void set(T t)
{
//setter code
}
}
Run Code Online (Sandbox Code Playgroud)
然后我让这个 ClassChild 扩展了 ClassParent
class ClassChild extend ClassParent<String> {
public void set(String str)
{
//setter code
}
}
Run Code Online (Sandbox Code Playgroud)
实例化 ClassChild 类的新实例。
ClassParent<String> child = new ClassChild();
Run Code Online (Sandbox Code Playgroud)
显然,为了保留多态性,java编译器将在类中创建一个桥接方法ClassChild。我的问题是,在使用命令编译代码后javac,我想看看编译后的代码是什么样子,但我不知道该怎么做。.class我使用 NotePad++打开该文件,但我只看到了乱码。如何查看编译后的代码是我的问题。总的来说,我对编程很陌生。谢谢
编译器是否编译了一个简单的三元语句,以便编译一个简单的if else语句?另外,为什么编译器会被设计为以不同方式编译它们?
例如,这样:
int a = 169;
int b = 420;
int c;
c = a > b ? 42:69;
Run Code Online (Sandbox Code Playgroud)
编译成同样的东西:
int a = 169;
int b = 420;
int c;
if(a>b) c = 42;
else c = 69;
Run Code Online (Sandbox Code Playgroud)
这个问题不是关于哪个更好或何时使用每个问题,所以请不要在答案中包含这个问题.
哪个具有更大的字节码大小或在 Java 中相同?
if (a > b) a = b;
Run Code Online (Sandbox Code Playgroud)
对比
if (a > b) {
a = b;
}
Run Code Online (Sandbox Code Playgroud) java ×8
bytecode ×5
jvm ×2
.class-file ×1
android ×1
decompiler ×1
generics ×1
heap ×1
javacompiler ×1
jvm-bytecode ×1
security ×1
string ×1