Java 反射:从未知的正在运行的应用程序中获取值

Java 反射:从未知的正在运行的应用程序中获取值,java,reflection,runtime,Java,Reflection,Runtime,我正在编写一个应用程序,在未知应用程序(由用户传递)中的未知类字段中搜索信号量类型。我用反射法做的,效果很好 现在我想用值填充这些信号量,从这个未知应用程序的运行实例中获取它们。因此,我使用这个未知应用程序的“main”方法获取类,创建一个新实例,并在调用main方法启动应用程序时传递它: Class mainClass = getItSomeWhere(); Object instance = mainClass.newInstance(); Method mainMethod = mainC

我正在编写一个应用程序,在未知应用程序(由用户传递)中的未知类字段中搜索信号量类型。我用反射法做的,效果很好

现在我想用值填充这些信号量,从这个未知应用程序的运行实例中获取它们。因此,我使用这个未知应用程序的“main”方法获取类,创建一个新实例,并在调用main方法启动应用程序时传递它:

Class mainClass = getItSomeWhere();
Object instance = mainClass.newInstance();
Method mainMethod = mainClass.getDeclaredMethod("main", new Class[]{String[].class});
mainMethod.invoke(instance, new Object[]{args});
而且效果很好

现在,当我只有一个主类的实例时,如何从这个正在运行的应用程序的类中获取信号量值


非常感谢您的回答。

好的,信号量和所有其他类一样只是一个类。如果您是指类型信号量的类级实例,那么它很简单(与处理其他类型的类级变量完全相同):

但是,如果您希望处理定义到方法中的变量,则必须使用字节码工程库(例如,来自雅加达的BCL)

顺便说一句,您确实不应该创建包含主方法的类的实例:

  • 您不知道调用哪个构造函数以及使用哪个参数
  • 类可能是抽象的,所以您根本无法实例化它
    • @AlexR:

      我知道这有点不可思议,我会尽力解释:

      如果应用程序的mainClass如下所示:

      public class MainClass{
      
             public static void main(String [] args){
                          new Gui();
             }
      }
      
      如果通过反射启动main方法,则无法获取Gui的字段值,也无法获取Gui所拥有的类的实例等

      你明白这个问题吗


      编辑: AlexR,谢谢你让我知道来自雅加达的BCEL,它帮助我解决了这个问题

      在学习如何使用它时,我编辑了所有有
      新信号量()的应用程序类文件行,我将其替换为一个定制的信号量扩展类,该类允许我获取值,并将其传递给观察者对象


      非常感谢,新年快乐

      您甚至不必创建实例。Main方法是静态的,所以您可以调用它,而无需实例传递null。您说“信号量”是什么意思?同步块?我知道我可以传递null,但我需要一个实例,让我获得值。对于信号量,我指的是java.util.concurrent.Semaphore类现在我理解了您告诉我的有关实例的内容,您的意思是main方法不会改变istance中的任何内容。那么,我如何在其他类中获取信号量值呢?感谢您告诉我如何从方法中获取字段,它也将非常有用!但现在这不是我的问题。我只是从类中的字段获取信号量。我只知道如何使用正在运行的“客户端”(意思是未知,由用户选择)应用程序的运行实例获取字段值。
      field.get(instance)
      返回特定实例的字段值。我只有main类的实例,我不能将其用于其他类的字段对不起,我不明白你的意思。如果您有实例,可以说instance.getClass().getDeclaredFields()。然后遍历这些字段,说field.get(实例)。
      public class MainClass{
      
             public static void main(String [] args){
                          new Gui();
             }
      }