Tag: contextclassloader

在tomcat中重新加载类文件

我在运行时创建一个类文件。 我想用类加载器中的更新版本替换现有的类文件。 它类似于热交换(例如JRebel),它避免了服务器重启和重新部署。 我找到了tomcat用于上下文重载的context.xml方法。 但在生产环境中它并不是很有用。 我们可以在运行时使用ClassLoader注册类吗? 请建议是否有任何替代方法在运行时重新加载类。 我使用以下代码来检索当前的classLoader。 ClassLoader classLoader = LoggingAspect.class.getClassLoader(); 下面是load class方法的实现。 public class AspectClassLoader extends ClassLoader{ @Override public synchronized Class loadClass(String name) throws ClassNotFoundException { String customLoadClass = “com.log.LoggingAspect”; try { if(!customLoadClass.equals(name)) { return super.loadClass(name); } else { URL classLoadUrl = new URL(this.reloadClassUrl); URLConnection connection = classLoadUrl.openConnection(); InputStream input = connection.getInputStream(); ByteArrayOutputStream […]

Thread.getContextClassLoader()== null?

Thread.getContextClassLoader()可以为null吗? javadoc并不是很清楚。 图书馆是否应考虑此案例? 更新:我问的原因是beansbinding.dev.java.net在这种情况下不起作用setContextClassLoader(null)我的代码确实setContextClassLoader(null)

如何安全地解决此Java上下文类加载器问题?

我的数百名用户中只有一个在启动Java桌面应用程序时遇到问题。 只有三分之一的时间才开始。 另外三分之二的时间在启动时抛出NullPointerException: Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:394) at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1327) at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1309) at javax.swing.JEditorPane.loadDefaultKitsIfNecessary(JEditorPane.java:1387) at javax.swing.JEditorPane.getKitTypeRegistry(JEditorPane.java:1344) at javax.swing.JEditorPane.getEditorKitClassNameForContentType(JEditorPane.java:1340) at javax.swing.JTextPane.(JTextPane.java:76) at myapp.Launcher$1.run(Launcher.java:13) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:633) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 我已经按照堆栈跟踪找到原因 Thread.currentThread().getContextClassLoader() 在JEditorPane中返回null。 谷歌搜索显示,这是一个零星的,非常罕见的,神秘的问题,影响了一些人。 我的问题是,作为一种解决办法,我能做些什么? 如果我在创建EditorPane之前调用它,这可能会有效: Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader()); 但我并不像我想的那样真正理解类加载器(我试图更好地理解它们)。 我觉得改变EDT中的contextClassLoader可能会产生不良影响。 任何想法我能做什么? 编辑:我与熟悉Java ClassLoaders的人有一些通信。 这似乎是一个模糊的ClassLoader竞争条件。 也就是Java中的一个bug。