我有一个.class文件,但对.class文件一无所知,包括类名、字段或方法。我需要做的是找出关于这个类的一切,并实例化这个类的一个对象。
请记住,我们对.class文件内部一无所知,在调用getDeclareMethod()、getDeclareFields()和getDeclareConstructor()之后,我知道它包含一个String str字段和一个带有一个String参数的空方法,该方法试图为变量str和一个不带任何参数的纯构造函数指定一个名称。
因此,问题是如何实例化一个对象并调用该方法来将字符串分配给str?当类或方法的声明在同一个文件中时,我知道怎么做,但这是一个未知的.class文件,我向你们寻求帮助。
发布于 2012-05-10 13:04:09
首先,需要将.class文件转换为Class对象。您可以使用URLClassLoader来实现这一点。
让我们假设您有一个File classFile和一个String className。
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中。
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();
}请注意,如果方法名未知,则必须创建一种识别它的方法,这可以通过反射来完成,但更稳定的方法是使用字节码注入/修改/分析库(如ASM或BCEL )检查方法的字节码。虽然BCEL自2006年以来一直没有更新,但我个人认为它更容易学习如何使用;然而,ASM要快得多,而且是最新的。
发布于 2012-05-10 12:52:53
您可以将该.class文件转换为java文件,即使用JAD对其进行反编译,然后知道java文件的源代码。
你可以使用this资源,也可以在谷歌上找到更多。
发布于 2012-05-10 12:55:23
只需按照本教程进行操作,您将获得所有的答案。
Using Java Reflection
反射是Java编程语言中的一个特性。它允许正在执行的Java程序检查或“自省”自己,并操纵程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们。
https://stackoverflow.com/questions/10527658
复制相似问题