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