【问题标题】:How to get as a stream any class loaded from a jar not in the classpath?如何获取从不在类路径中的 jar 加载的任何类作为流?
【发布时间】:2014-12-06 13:19:13
【问题描述】:

我有一个网络应用程序,我想大致如下工作:

有人上传了一个 jar(比如 myjar.jar)以及要分析的类的名称(比如 test.Test)。分析的确切目的无关紧要,因此假设网络应用程序对其进行了一些静态分析。

我可以使用herehere (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,因为它提供了我无法通过 getDeclaredMethodsgetMethods 获得的其他信息(例如参数名称)。

【问题讨论】:

    标签: java reflection jar classloader urlclassloader


    【解决方案1】:

    Re: “现在我需要找出 test.Test 里面有哪些方法”

    您可以通过Class c = jarLoader.loadClass("test.Test", true); 获取课程。 Class 也有getDeclaredMethods()getMethods()


    编辑:@Jus12,来自您的第二个链接Java Tip 70: Create objects from jar files!

    protected byte[] loadClassBytes (String className)

    ASM 有一个ClassReader(byte[] b) 构造函数。

    【讨论】:

    • 请看我的编辑。我想要的不仅仅是获取方法。我需要将类作为流,因为这是 asm 分析器需要的。
    【解决方案2】:

    您可以使用URLClassLoader,它在其构造函数中采用ListURLs。然后,您可以通过在 URLClassLoader 实例上调用 loadClass 方法来加载该类,以获取您所追求的类的 Class<?> 对象。一旦你有了它,你就可以使用反射来创建实例,和/或获取关于类的一般信息。

    我没试过,但URLClassLoader 也有getResourceAsStream 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2018-09-23
      相关资源
      最近更新 更多