我最近阅读了很多关于 Java 类加载过程的内容。我经常遇到声称在运行时无法将类添加到类路径并在没有类加载器骇客(URLClassLoaders 等)的情况下加载它们的文本
据我所知,类是动态加载的。这意味着它们的字节码表示仅在需要时才加载并转换为 java.lang.Class 对象。
那么在 JVM 启动并加载这些类之后,是否可以将 JAR 或 *.class 文件添加到类路径中,前提是它们尚未加载? (要明确:在这种情况下,类路径只是文件系统上的文件夹。“添加 JAR 或 *.class 文件”只是意味着将它们放入此文件夹中。)
如果不是,这是否意味着在 JVM 启动时搜索类路径,并且找到的类的所有完全限定名称都缓存在内部“列表”中?
如果你能在你的答案中指出我的一些来源,那就太好了。最好是官方 SUN 文档:Sun JVM Spec .我已阅读规范,但找不到有关类路径的任何信息,以及它是否在 JVM 启动时完成。
附言
这是一个理论问题。我只是想知道这是否可能。我没有什么实际想要实现的。这只是我对知识的渴望:)
最佳答案
这里混合了两个概念:类路径和类路径中的类文件。
如果您将类路径指向一个目录,通常将文件添加到该目录并将其作为类路径的一部分拾取是没有问题的。由于类路径中所有类的潜在大小,现代 JVM 在启动时将它们全部加载是不可行的。但是,它的值(value)有限,因为它不包含 Jar 文件。
但是,在运行的 JVM 上更改类路径本身(搜索哪些目录、jar 等)将在很大程度上取决于实现。据我所知,在标准 Sun JVM 上,没有记录(如保证工作)实现此目的的方法。
一般来说,如果这是您需要做的事情(有一个在运行时更改的动态类路径),那么您希望实现一个 ClassLoader,如果没有其他原因,只是为了能够丢弃它并创建一个新的如果需要卸载它们,则不再引用这些类。
但是,对于少量的动态加载,有更好的方法。在 Java 1.6 中,您可以在一个目录 (*.jar) 中指定所有 jar 文件,这样您就可以告诉用户将其他库放在指定位置(尽管它们必须在启动时就在那里)。
您还可以选择在类路径中包含一个 jar 文件或其他位置,即使您不需要它,作为某人在其中放置可选 jar 或资源文件(例如日志配置文件)的占位符.
但如果您需要在应用程序运行时进行严格的动态类加载,尤其是卸载,则需要实现 Classloader。
关于java - JVM启动后Java类路径是最终的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2942536/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg