- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
线程的上下文类加载器和普通类加载器有什么区别?
也就是说,如果Thread.currentThread().getContextClassLoader()
和getClass().getClassLoader()
返回不同的类加载器对象,会使用哪一个?
最佳答案
这并没有回答原来的问题,但是由于这个问题的排名很高并且与任何 ContextClassLoader
查询都有关联,所以我认为回答上下文类加载器应该何时加载的相关问题很重要用过的。简短回答:永远不要使用上下文类加载器!但当您必须调用缺少 ClassLoader
参数的方法时,将其设置为 getClass().getClassLoader()
。
当来自一个类的代码要求加载另一个类时,要使用的正确类加载器是与调用者类相同的类加载器(即,getClass().getClassLoader()
)。 99.9% 的时间都是这样,因为 this is what the JVM does itself第一次构造新类的实例、调用静态方法或访问静态字段时。
当您想使用反射创建类时(例如反序列化或加载可配置的命名类时),执行反射的库应该总是询问应用程序要使用哪个类加载器,通过从应用程序接收 ClassLoader
作为参数。应用程序(它知道所有需要构造的类)应该传递给它 getClass().getClassLoader()
。
获取类加载器的任何其他方式都是不正确的。如果图书馆使用诸如 Thread.getContextClassLoader()
之类的黑客手段, sun.misc.VM.latestUserDefinedLoader()
, 或 sun.reflect.Reflection.getCallerClass()
这是一个由 API 缺陷引起的错误。基本上,Thread.getContextClassLoader()
的存在只是因为设计 ObjectInputStream
API 的人忘记接受 ClassLoader
作为参数,这个错误一直困扰着Java 社区至今。
就是说,许多 JDK 类使用一些技巧之一来猜测要使用的类加载器。有些使用 ContextClassLoader
(当您在共享线程池上运行不同的应用程序时失败,或者当您离开 ContextClassLoader null
时失败),有些遍历堆栈(当类的直接调用者本身就是一个库),一些使用系统类加载器(这很好,只要记录为仅使用 CLASSPATH
中的类)或引导类加载器,还有一些使用上述技术的不可预知的组合(这只会让事情变得更加困惑)。这导致许多人哭泣和咬牙切齿。
当使用这样的 API 时,首先,尝试找到接受类加载器作为参数的方法的重载。如果没有明智的方法,则尝试在 API 调用之前设置 ContextClassLoader
(并在之后重置它):
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
// call some API that uses reflection without taking ClassLoader param
} finally {
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
关于java - 线程上下文类加载器和普通类加载器的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108711/
出现以下错误 Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable D
在调试应用程序时出现以下错误。 The CLR has been unable to transition from COM context 0x3b2d70 to COM context 0x3b2
在 GAE Go 中,为了记录,我们需要使用 appengine.NewContext(r) 创建一个新的上下文,它返回 context.Context。 如何使用此上下文在请求范围内设置/获取变量?
我想使用 Puppeteer 从放置在页面上 iframe 内的选择器中获取数据,该页面在与其父框架域不同的域上运行。因此,我不是任何域的所有者 - 无法使用 frame.postMessage。 试
我正在尝试获取可用的应用程序上下文并想切换到 webview 上下文,但 appium 仅获取 Navive App。 应用程序还启用了 WebView。 Appium 版本:1.10.1 Chrom
这个问题在这里已经有了答案: How to fix this nullOk error when using the flutter_svg package? (7 个回答) 7 个月前关闭。 当我尝
我观看了关于 Core Data 的 2016 WWDC 视频并查看了各种教程。我见过使用 Core Data Framework 创建对象以持久保存到 managedObjectContext 中的
这是代码 obj = { a: 'some value'; m: function(){ alert(this.a); } } obj.m(); 结果是'som
我正在尝试做类似的事情 $(".className").click(function() { $(this).(".anotherClass").css("z-index","1");
var User = { Name: "Some Name", Age: 26, Show: function() { alert("Age= "+this.Age)}; }; fun
我目前正在使用我见过的常见 Context 模式,它允许子组件通过传递修饰函数来更新父组件的状态(即 Provider)通过共享的 Context。 我遇到的问题是,修改函数只引用原始状态,不引用最新
有没有办法让 React Context类型安全与流类型? 例如: Button.contextTypes = { color: React.PropTypes.string }; 最佳答案 不幸
我想知道是否有一种方法可以为不同的功能使用不同的上下文类。 我希望有一个功能使用 MinkExtensions 进行浏览器测试,另一个功能使用和 HTTP 客户端(如 Guzzle)进行 API 测试
我有这个配置文件 apiVersion: v1 clusters: - cluster: server: [REDACTED] // IP of my cluster name: stag
我在实现非抢先式调度时遇到了用于初始化TCB的代码。 typedef struct TCB_t { struct TCB_t *next; struct TCB_t
我想将一个函数设置为数组中每个元素的属性,但使用不同的参数调用它。我想我会使用匿名函数来解决它: for ( var i = 0; i < object_count; i++ ) { obje
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 7 年前。 我正在做一些练习,但我在管道方法中丢
我正在尝试通过 Java 和 Android Studio 学习和制作 Android 应用程序。我对Java的了解程度是两年前几个小时的youtube学习和大学基础类(class)。不过我确实知道如
我在(这个)上遇到了问题。错误ImageView无法应用。我在 fragment 类中执行此代码。 ViewFlipper v_flipper; @Nullable @Override public
我想使用 openGL 的某些功能,但与渲染视觉内容无关。有没有办法在没有任何依赖性的情况下创建它(不是对 Windows,也不是某些包[SDL,SFML,GLUT])?只允许使用没有外部库的库,就像
我是一名优秀的程序员,十分优秀!