首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JAVA中使用反射通过.class文件实例化对象并调用方法?

在JAVA中使用反射通过.class文件实例化对象并调用方法?
EN

Stack Overflow用户
提问于 2012-05-10 12:47:40
回答 4查看 2.5K关注 0票数 1

我有一个.class文件,但对.class文件一无所知,包括类名、字段或方法。我需要做的是找出关于这个类的一切,并实例化这个类的一个对象。

请记住,我们对.class文件内部一无所知,在调用getDeclareMethod()、getDeclareFields()和getDeclareConstructor()之后,我知道它包含一个String str字段和一个带有一个String参数的空方法,该方法试图为变量str和一个不带任何参数的纯构造函数指定一个名称。

因此,问题是如何实例化一个对象并调用该方法来将字符串分配给str?当类或方法的声明在同一个文件中时,我知道怎么做,但这是一个未知的.class文件,我向你们寻求帮助。

EN

回答 4

Stack Overflow用户

发布于 2012-05-10 13:04:09

首先,需要将.class文件转换为Class对象。您可以使用URLClassLoader来实现这一点。

让我们假设您有一个File classFile和一个String className

代码语言:javascript
运行
复制
try {
    URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.toURI().toURL()});
    Class<?> clazz = classLoader.loadClass(className);
} catch (Exception e) {
    // something went wrong..
    e.printStackTrace();
}

现在您已经将类文件存储在Class对象中,但是如何创建其类型的对象并从java.lang.reflect包的?Java reflection调用方法在这种情况下很有用。

假设您的Class<?>对象存储在一个名为clazz的变量、方法名称的String methodName和方法参数的String toSet中。

代码语言:javascript
运行
复制
try {
    Object instance = clazz.newInstance();
    Method method = clazz.getDeclaredMethod(methodName, String.class);
    method.setAccessible(true);
    method.invoke(instance, toSet);
} catch (Exception e) {
    // something went wrong..
    e.printStackTrace();
}

请注意,如果方法名未知,则必须创建一种识别它的方法,这可以通过反射来完成,但更稳定的方法是使用字节码注入/修改/分析库(如ASMBCEL )检查方法的字节码。虽然BCEL自2006年以来一直没有更新,但我个人认为它更容易学习如何使用;然而,ASM要快得多,而且是最新的。

票数 4
EN

Stack Overflow用户

发布于 2012-05-10 12:52:53

您可以将该.class文件转换为java文件,即使用JAD对其进行反编译,然后知道java文件的源代码。

你可以使用this资源,也可以在谷歌上找到更多。

票数 0
EN

Stack Overflow用户

发布于 2012-05-10 12:55:23

只需按照本教程进行操作,您将获得所有的答案。

Using Java Reflection

反射是Java编程语言中的一个特性。它允许正在执行的Java程序检查或“自省”自己,并操纵程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10527658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档