通过反射访问classLoader字段

问题描述 投票:1回答:1

我们有一个带有自定义类加载器的应用程序,我需要访问给定类的classLoader字段。但是,不能通过反射来访问此字段:-(

java.lang.Class的JavaDoc已清除:

// This field is filtered from reflection access, i.e. getDeclaredField
// will throw NoSuchFieldException

所以这就是我打电话给getDeclaredField("classLoader")时得到的可以通过某种方式获得(我看到IntelliJ调试通过某种方式实现了;如何?)

也许有些byteBuddy骗术?

java reflection classloader byte-buddy
1个回答
1
投票

您最好解释这个问题的原因:减少内存使用。如果您设法从其类加载器中提取类,则可能会发生其他问题。例如,equals()instanceof的工作方式可能不同(如果有的话),对象的反序列化可能会有所不同,等等。

1)我建议您检查造成内存消耗的真正原因是什么:是类加载实例本身还是该类加载器加载的类之一?例如,一个类可以具有一些消耗大量内存的静态字段。

2)如果类加载器实例消耗大量内存,请考虑对消耗大量内存的字段使用弱引用或高速缓存。

3)如果您想尝试“更聪明的方法”:考虑Java代理transform()redefineClasses。可以通过这种方式将所需的行为添加到由类加载器加载的类中,并简化消除不必要的引用并释放一些内存的任务。

© www.soinside.com 2019 - 2024. All rights reserved.