首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类& ClassLoader

类& ClassLoader
EN

Stack Overflow用户
提问于 2014-03-04 07:48:48
回答 2查看 101关注 0票数 0

我有一个自定义类装入器:CustomClassLoader(扩展ClassLoader)

我有一门课: IntegerPrint

我用自定义ClassLoader加载我的类。我原以为下面代码中的SOP会返回相同的值。但是第一个SOP打印"sun.misc.Launcher$AppClassLoader@..“&第二个SOP打印”CustomClassLoader@.“

为什么会这样?请给我建议。

代码语言:javascript
复制
public class IntegerPrinterTest {
    public static void main(String[] args) throws Exception {
        CustomClassLoader loader = new CustomClassLoader(IntegerPrinterTest.class.getClassLoader());
        Class<?> clazz = loader.loadClass("IntegerPrinter");
        System.out.println(IntegerPrinter.class.getClassLoader());
        System.out.println(clazz.getClassLoader());
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-04 08:32:48

你还想要什么?在……里面

代码语言:javascript
复制
System.out.println(IntegerPrinter.class.getClassLoader());

您创建了一个

代码语言:javascript
复制
 Class<IntegerPrint> 

对象,当然,它的类(Class)肯定是由某个类加载器加载的。不难想象,Class一定是很早就加载的,甚至在代码获得控制之前也是如此。

请用

代码语言:javascript
复制
java  -verbose:class ....

查看哪些类是按什么顺序排列的。

票数 2
EN

Stack Overflow用户

发布于 2014-03-04 08:28:58

第一个电话:

代码语言:javascript
复制
IntegerPrinter.class.getClassLoader()

将实际做到:

代码语言:javascript
复制
IntegerPrinterTest.class.getClassLoader().loadClass("IntegerPrinter")

因此它完全忽略了您的自定义类加载器。换句话说:您自己的类加载器实际上并不用于使用本机调用(如"new“等)创建的任何对象。要做到这一点,它还应该负责加载IntegerPrinter类。

在同一个类中这样做是相当谨慎的(通常是无用的),但您可以这样做:

代码语言:javascript
复制
Class<?> clazz = loader.loadClass("IntegerPrinterTest");
clazz.getMethod("main").invoke(null);

(请注意,这段代码没有经过测试,但应该近似于工作的内容)

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

https://stackoverflow.com/questions/22165920

复制
相关文章

相似问题

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