使用Java反射在运行时上下文中获取所有定义的变量(内部是Voodoo)

佩德罗

我有以下代码:

package teste;

public class Teste {

    public static void main(String[] args) {
        String arroz = "abc";
        Integer banana = 123;

        vaiBuscar();
    }

    private static void vaiBuscar() {
        Object[] obj = theMagicMethod();
        System.out.println(((String) obj[0])); 
        System.out.println(((Integer) obj[1])); 
    }
}

输出应为:

abc
123

现在有趣的部分是,我可以定义的唯一方法是TheMagicMethod()。因此,我需要获取调用我的上层方法中定义的所有变量值。如果有办法做到这一点,可能是通过反思。

总结一下:如果除了定义方法theMagicMethod()之外,您还不能编辑代码的任何部分,那么该方法应该如何实现,以便使该程序的输出与我上面写的一样?

谢谢!

编辑:这实际上并不需要解决反射问题。任何方式都适合,它只需要工作即可。

埃德温·巴克

在这些方法中,变量名会丢失。

Java是基于堆栈的计算机,因此一种方法看起来像

public int add(int first, int second) {
  int sum = first + second;
  return sum;
}

将会丢失字节码中sum的命名,该命名大致为

  pushInt firstParameter
  pushInt secondParameter
  addInt
  returnInt

请注意,中间变量名称sum在编译过程中已被完全销毁,因此无法从运行时检索它。

但是,还有许多其他项必须按名称引用,因此它们的名称不会在运行时被破坏。其中一些包括

 names of classes
 names of members
 names of methods
 names of enums
 names of interfaces

因此,可以在文件中获取所有已使用名称的子集.java但是,这样的子集将不会包含任何代码块的内部名称。

现在,如果您使用一些调试选项集(例如-g)进行编译,则可以改善可访问名称的数量;但是,不能保证您读入的任何类都是在设置了调试标志的情况下编译的(实际上,大多数类都不在设置了调试标志的情况下进行编译以提高加载性能)。

如果您无法针对任何执行此操作,则无法针对JVM执行此操作。

现在,如果您想尝试获取所有未在JVM中销毁的信息,则可以使用JDWP(调试线路协议),并了解一下暴露的内容。但是,我会怀疑它能否达到“一切”,因为它只能读取“由类加载器加载的一切”,并且(记住上面的声明)只能读取当时在编译中幸存的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Dlang中的反射在运行时获取变量值

来自分类Dev

在实体框架中在运行时将新模型添加到现有上下文中

来自分类Dev

Scala反射在运行时访问所有公共字段

来自分类Dev

使用反射在运行时创建类

来自分类Dev

使用反射在运行时创建类

来自分类Dev

具有类名的查询上下文仅在运行时知道

来自分类Dev

具有类名的查询上下文仅在运行时知道

来自分类Dev

使用C#中的上下文菜单在运行时删除控件

来自分类Dev

使用反射在运行时实例化List <T>的派生类

来自分类Dev

什么是“运行时上下文”?

来自分类Dev

为什么即使我有#[tokio :: main],也会收到错误消息“没有反应堆在运行,必须从Tokio运行时的上下文中调用”?

来自分类Dev

带有插件样式系统的EF多上下文。如何在运行时应用迁移?

来自分类Dev

在Python上下文中什么是运行时?它由什么组成?

来自分类Dev

确定在运行时调用哪种方法而无需使用接口作为上下文(无Java8功能)

来自分类Dev

确定在运行时调用哪种方法而不使用用于上下文的接口(无Java8功能)

来自分类Dev

Emscripten:如何在运行时检测 webgl 上下文版本?

来自分类Dev

是否超过一个密封类结果在运行时反射在表达时使用`is`的?

来自分类Dev

如何在运行时使用类型定义具有内部类的类?

来自分类Dev

当在Behat上下文中作为Symfony Process运行时,带有Expect的生成交互式CLI命令以0提前退出

来自分类Dev

从FISH运行时自定义bash“上下文”

来自分类Dev

constexpr上下文中constexpr函数内部的所有函数都必须是constexpr函数吗?

来自分类Dev

通过Sentry Javascript显示/获取运行时,操作系统,设备上下文

来自分类Dev

全局执行上下文中没有内部函数的 JavaScript 变量不可用

来自分类Dev

Scala运行时反射甚至可以为内部类获取特定类型的所有成员

来自分类Dev

为什么Tokio返回错误“在不允许阻塞的上下文中不能删除运行时”?

来自分类Dev

Spring上下文作为运行时依赖

来自分类Dev

在运行时编译/运行.java文件与反射

来自分类Dev

在运行时编译/运行.java文件与反射

来自分类Dev

EFCore支架数据库并在运行时迁移到另一个上下文

Related 相关文章

  1. 1

    使用Dlang中的反射在运行时获取变量值

  2. 2

    在实体框架中在运行时将新模型添加到现有上下文中

  3. 3

    Scala反射在运行时访问所有公共字段

  4. 4

    使用反射在运行时创建类

  5. 5

    使用反射在运行时创建类

  6. 6

    具有类名的查询上下文仅在运行时知道

  7. 7

    具有类名的查询上下文仅在运行时知道

  8. 8

    使用C#中的上下文菜单在运行时删除控件

  9. 9

    使用反射在运行时实例化List <T>的派生类

  10. 10

    什么是“运行时上下文”?

  11. 11

    为什么即使我有#[tokio :: main],也会收到错误消息“没有反应堆在运行,必须从Tokio运行时的上下文中调用”?

  12. 12

    带有插件样式系统的EF多上下文。如何在运行时应用迁移?

  13. 13

    在Python上下文中什么是运行时?它由什么组成?

  14. 14

    确定在运行时调用哪种方法而无需使用接口作为上下文(无Java8功能)

  15. 15

    确定在运行时调用哪种方法而不使用用于上下文的接口(无Java8功能)

  16. 16

    Emscripten:如何在运行时检测 webgl 上下文版本?

  17. 17

    是否超过一个密封类结果在运行时反射在表达时使用`is`的?

  18. 18

    如何在运行时使用类型定义具有内部类的类?

  19. 19

    当在Behat上下文中作为Symfony Process运行时,带有Expect的生成交互式CLI命令以0提前退出

  20. 20

    从FISH运行时自定义bash“上下文”

  21. 21

    constexpr上下文中constexpr函数内部的所有函数都必须是constexpr函数吗?

  22. 22

    通过Sentry Javascript显示/获取运行时,操作系统,设备上下文

  23. 23

    全局执行上下文中没有内部函数的 JavaScript 变量不可用

  24. 24

    Scala运行时反射甚至可以为内部类获取特定类型的所有成员

  25. 25

    为什么Tokio返回错误“在不允许阻塞的上下文中不能删除运行时”?

  26. 26

    Spring上下文作为运行时依赖

  27. 27

    在运行时编译/运行.java文件与反射

  28. 28

    在运行时编译/运行.java文件与反射

  29. 29

    EFCore支架数据库并在运行时迁移到另一个上下文

热门标签

归档