当前位置: 首页 > 面试题库 >

从字节码解析类名

祁永嘉
2023-03-14
问题内容

是否可以从由类源代码形成的字节码中提取出一个类名?

情况是这样的:我从某个地方远程获得了一个字节码类,不管它来自何处。为了使用类加载器有效地加载该类,我还需要具有类名称…对吗?


问题答案:

如果只需要类名,则可能自己解析类文件的开头,而不是仅仅为此目的而添加用于处理类代码的第三方库。您只需要常量池中的类和字符串,跳过访问标志,然后将/替换为即可。在班级名称中。如果有字节数组,则可以使用以下方法调用此方法new ByteArrayInputStream(byteArray)

public static String getClassName(InputStream is) throws Exception {
    DataInputStream dis = new DataInputStream(is);
    dis.readLong(); // skip header and class version
    int cpcnt = (dis.readShort()&0xffff)-1;
    int[] classes = new int[cpcnt];
    String[] strings = new String[cpcnt];
    for(int i=0; i<cpcnt; i++) {
        int t = dis.read();
        if(t==7) classes[i] = dis.readShort()&0xffff;
        else if(t==1) strings[i] = dis.readUTF();
        else if(t==5 || t==6) { dis.readLong(); i++; }
        else if(t==8) dis.readShort();
        else dis.readInt();
    }
    dis.readShort(); // skip access flags
    return strings[classes[(dis.readShort()&0xffff)-1]-1].replace('/', '.');
}


 类似资料:
  • 我正在尝试使用最新发布的Geb和TestNG groovy/java库获得一个功能测试套件。JDK似乎有问题,但我找不到任何关于解决这个问题的信息。 测试版本: 例外情况:

  • 问题内容: 我遇到了一些有关JVM / JIT活动的参考,其中似乎在编译字节码和解释字节码之间有区别。该特定注释声明的字节码在前10000次运行时进行解释,然后进行编译。 “编译”和“解释”字节码之间有什么区别? 问题答案: 解释字节码基本上是逐行读取字节码,不进行任何优化或任何操作,然后对其进行解析并实时执行。由于许多原因,这种方法效率低下,其中包括Java字节码设计得不能快速解释的问题。 编译

  • 问题内容: 我正处于从文件中读取某些数据作为字节流的过程中,并且刚刚遇到了一些不确定如何处理的unicode字符串。 每个字符使用两个字节,只有第一个看起来包含实际数据,因此,例如,字符串“ trust”在文件中的存储方式为: 通常,我只使用正则表达式将零替换为零,从而删除空格。但是,文件中单词之间的空格是使用来实现的,因此尝试执行一个简单的String’replaceAll’会使它有点混乱。 我

  • 问题内容: 给定任意实例,包括运行时生成的实例(磁盘上没有文件),是否有任何方法获取类字节? 问题答案: 通常,这是不可能的。在加载类时,JVM会解析其字节码并将其转换为内部表示形式。此后,JVM可以随意忘记原始字节码,这就是HotSpot JVM真正发生的情况。 但是,对于某些黑客,可以检查内部类表示并将其转换回有效的类文件(尽管它将与原始字节码不同)。在HotSpot JVM中,该过程用于重新

  • 我刚切换到Android Studio 2.1,在尝试编译之前运行的应用程序时出现了以下错误: 我已经更新了主项目的gradle。生成文件以强制生成Java 1.7代码: 我还更新了gradle模块。按如下方式构建以设置java版本: 正在使用Maven构建子模块。在pom.xml文件中,我还尝试强制生成1.7代码。 我知道我正在使用一个组装工件,它包含了从属模块,但我没有更改任何从属模块,并且上

  • 问题内容: 我经常卡在没有源的Java类文件中,并且试图理解我手头的问题。 请注意,反编译器是有用的,但在所有情况下都不足够… 我有两个问题 有哪些工具可用来查看Java字节码(最好从linux命令行中获得) 什么是熟悉Java字节码语法的良好参考 问题答案: 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定文件创建源文件。 该