我有一个.class文件一窍不通的.class文件,其中包括类名,字段或方法。 我需要做的是找出对课堂上的一切和实例化类的对象。
请记住,我们一无所知的.class文件中,调用getDeclareMethod(),getDeclareFields()和getDeclareConstructor()之后,我知道,它包含提交字符串str和一个字符串参数的空隙的方法,其尝试分配一个名称到变量str,没有任何参数的纯构造函数。
所以,问题是如何实例化一个对象,并调用指定一个字符串为str的方法? 我知道该怎么做时,类或方法的声明是在同一文件中,但是这一次是一个未知的.class文件,我想谈谈你们的帮助。
首先,你需要将.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反射 ,将的java.lang.reflect
包,就是在这种情况下非常有用。
让我们假设你有你的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是远远快,是跟上时代的。
您可以在.class文件转换成即它采用JAD,然后知道Java文件的源编译Java文件。
你可以利用这个资源,还可以找到更多关于谷歌。
如果你有.class文件,你可以写你自己的ClassLoader,并使用的defineClass来创建类的实例。 从那里,你可以得到的名字,和任何构造函数。 如果它有一个空的构造函数,你只需做的newInstance的Class实例,否则你将需要追捕一个构造,并通过适当的参数的构造函数newInstance方法。
就在这个教程中去日子会把你让所有的答案..
使用Java反射机制
反思是在Java编程语言中的功能。 它允许执行Java程序来检查或“反思”在自身和处理程序的内部属性。 例如,有可能为一个Java类,以获得其所有成员的名字并显示出来。
文章来源: instantiate an object and invoking a method via a .class file using reflection in JAVA?