相关疑难解决方法(0)

用Java字节码编程

我想用Java字节码编写一个简短的程序(也许是一个Hello World).我只想用文本编辑器编写字节码并运行它.我该怎么做?有一个例子吗?谢谢!

java bytecode

46
推荐指数
5
解决办法
1万
查看次数

是否有java类文件/字节码编辑器来编辑指令?

是否有用于编辑java类文件的实用程序(或eclipse插件)?我想操纵java类文件的字节码而不重新编译它,也没有完整的构建路径.

例如,重命名方法,添加/删除指令,更改常量等.

我找到的唯一工具是:

  • 类编辑 ,但它在功能上非常有限的(如物联网和操作说明改名是不可能的).

  • jbe不保存更改(可能因为类验证失败 - 在我进行任何更改之前,尽管类运行完美)

    (jbe最初有一个类路径问题,将jbe.bat文件的类路径添加到了帮助中)

java bytecode bytecode-manipulation decompiler .class-file

30
推荐指数
3
解决办法
2万
查看次数

是否可以查看Java类文件字节码

我正在使用Java进行字节码操作/生成,我只是想知道是否有一种简单的方法可以检查字节码.我不想反编译文件,我想实际查看编译后的字节码.我不需要编辑它.任何用于执行此操作的链接或程序都是可接受的答案.

java bytecode

16
推荐指数
3
解决办法
1万
查看次数

隐藏库源代码

我正在开发一个 android 库,我想隐藏它的代码。我正在使用其他库,对于其中一些库,当尝试使用 Android Studio 访问他们的代码时,您只能获得类的方法列表和“/ * 编译代码* /”。我正在使用 pro-guard,但我仍然可以访问我的库的源代码。即使修改了方法和成员名称,代码仍然是可读的,并且可以读取每个硬编码的字符串。

如何以与这些库相同的方式隐藏我的代码?

security android android-proguard

7
推荐指数
1
解决办法
4286
查看次数

直接编辑.class文件,使用操作码

今天我只是尝试在编译的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)

java jvm bytecode

4
推荐指数
1
解决办法
2408
查看次数

内存中创建了多少个字符串?

说我有这个String表达

String hi = "Tom" + "Brady" + "Goat"
Run Code Online (Sandbox Code Playgroud)

我知道字符串池"允许运行时通过在池中保留不可变字符串来节省内存" 字符串池

字符串池中将创建多少个字符串?

我最初的猜测是5 - ,"Tom","Brady","Goat","TomBrady","TomBradyGoat"因为操作顺序的String级联(左到右?),或者是它只是最后的结果,"TomBradyGoat",存储在字符串池?

java string heap concatenation string-concatenation

4
推荐指数
1
解决办法
115
查看次数

如何查看Java编译后的代码

我有这个 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++打开该文件,但我只看到了乱码。如何查看编译后的代码是我的问题。总的来说,我对编程很陌生。谢谢

java generics

2
推荐指数
1
解决办法
1万
查看次数

做三元和If/Else编译到同一个东西,为什么?

编译器是否编译了一个简单的三元语句,以便编译一个简单的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

0
推荐指数
1
解决办法
379
查看次数

-2
推荐指数
1
解决办法
53
查看次数