【发布时间】:2014-12-06 13:19:13
【问题描述】:
我有一个网络应用程序,我想大致如下工作:
有人上传了一个 jar(比如 myjar.jar)以及要分析的类的名称(比如 test.Test)。分析的确切目的无关紧要,因此假设网络应用程序对其进行了一些静态分析。
我可以使用here 和here (MultiClassLoader) 中描述的技巧来上传jar 并在Java 中加载类。
如果我知道类中的方法,我可以使用反射来调用它们。下面假设一个带有签名foo(String)的方法
Class c = jarLoader.loadClass("test.Test", true);
Object instance = c.newInstance();
Method foo = instance.getClass().getDeclaredMethod("foo", new Class[]{String.class});
// foo takes one para String
foo.setAccessible(true);
foo.invoke(instance, (Object) "hello");
现在,假设我需要找出test.Test 中的方法。为此,我使用了ASM framework,需要将类作为流。这是我遇到问题的地方。我无法做到getResourceAsStream 或其等价物。这是我尝试过的:
Type t = org.objectweb.asm.Type.getType(c); // uses asm library
String url = t.getInternalName() + ".class";
c.getClassLoader().getResourceAsStream(url); // gives null
如果我使用同样的问题:
c.getClassLoader().getResourceAsStream(c.getSimpleName() + ".class");
等等。
将资源作为流获取的正确方法是什么,其中资源是从 jar 加载的类文件,而不是在类路径中。请注意,整个事情是通过网络应用程序完成的。
编辑:获取方法只是一个例子。我真正想要的是将课程作为流。我需要使用 ASM,因为它提供了我无法通过 getDeclaredMethods 或 getMethods 获得的其他信息(例如参数名称)。
【问题讨论】:
标签: java reflection jar classloader urlclassloader