在Java线程上反转类加载顺序

时间:2016-08-23 08:28:44

标签: java multithreading

是否可以在单独运行java应用程序的单个Java线程上反转类加载路径。

即所有其他线程都正常运行并从前到后搜索类路径,而单个线程将在类路径中搜索到前面。

1 个答案:

答案 0 :(得分:0)

实际用例是什么?为什么单独的线程需要以相反的顺序查找?

您可以尝试创建自己的客户类加载器,以便从类路径以相反的顺序查找,并使用thread.setContextClassLoader(..)api将该类加载器设置为该线程的上下文类加载器。然后显式使用该上下文类加载器来加载类或任何其他资源。

但有几点需要注意:

1)一般来说,类加载器是父类的首先......这意味着,当你创建一个自定义类加载器时,你将设置父类加载器(通常是系统类加载器,除非你在应用程序中使用了任何其他自定义加载器)。否则你将无法加载java。*类,这些类只能由bootstrap loader(root)加载。根据规则,你应该首先将类加载请求委托给父级,并且只有在找不到的情况下,然后加载自己。因此,当你尝试使用parent时,无论如何都会以原始顺序查找并加载该类。所以为了这个工作,你将不得不打破这个规则。首先,你必须在类加载器中反向查找,而不是找不到,应该委托父类加载器来加载它

2)如果父类加载器已经加载了类,则类加载器可能会再次加载它。这意味着,此线程中加载的类将被视为一个单独的实例。

从未尝试过这个,但理论上这应该有用......但是所有实际目的,这可能对于(2)中提到的原因没有用。

这些链接非常有用:link1 link2 link3

另一种方法是,只需更改系统类加载器,当你加载/查找类时,根据当前线程名称查找你想要的任何顺序。

这两种方法都很奇怪,但要求是: - )