当前位置: 首页 > 知识库问答 >
问题:

为什么JVM允许类不在运行时的类路径中

施同
2023-03-14

在学习和使用spring-boot之后,我了解了spring-boot ConditionalOnClass的用法和逻辑,我的问题是:

    < li >为什么“因为这个注释是通过加载类字节码来解析的,所以在这里指定最终可能不在类路径上的类是安全的”。 < li >与此相关的JVM规范在哪里?

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnClass.java#L39

/**
 * The classes that must be present. Since this annotation is parsed by loading class
 * bytecode, it is safe to specify classes here that may ultimately not be on the
 * classpath, only if this annotation is directly on the affected component and
 * <b>not</b> if this annotation is used as a composed, meta-annotation. In order to
 * use this annotation as a meta-annotation, only use the {@link #name} attribute.
 * @return the classes that must be present
 */
Class<?>[] value() default {};

共有1个答案

益炜
2023-03-14

因为Spring捕获ClassNotFoundException。检查源代码-https://github.com/spring-projects/spring-boot/blob/d3c34ee3d1bfd3db4a98678c524e145ef9bca51c/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnClassCondition.java#L218

 类似资料:
  • 问题内容: 我阅读并发现在 System类下有一些函数作为getproperties,我们可以在其中检索属性,然后也可以使用setProperties()对其进行设置。 但是我得到的答案是它不会工作。我自己还没有尝试过,但是,我正在接听电话。 只是为了澄清一下,如果这些setProperty()和getProperty()方法无法在运行时更改它们,为什么会存在它们。还是仅特定于classpath属

  • 问题内容: 想知道不指定classpath选项时默认的classpath是什么吗? 问题答案: 当前的工作目录()。 从Java™教程中:PATH和CLASSPATH: 类路径 的 默认值为“。” ,表示仅搜索当前目录。指定CLASSPATH变量或-cp命令行开关将覆盖此值。 这包括子目录吗? 不,在类路径中没有条目是“递归的”。您必须明确列出每个子目录(或jar)。但是,如果您有一个表示clas

  • 问题内容: 我想理解为什么做出这个决定。通用异常有什么问题? (据我所知,泛型只是编译时的语法糖,Object无论如何它们都将转换为.class文件,因此有效地声明泛型类就好像其中的所有内容都是Object。。如果我错了,请更正我) 问题答案: 正如标记所说,类型是不可更改的,在以下情况下会出现问题: 两者和都被擦除为相同类型,JVM无法区分异常实例,因此也无法确定应执行哪个块。

  • 根据“show Runtime:fullclasspath”,运行时类路径只包含target/scala-2.11/classes和~/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.11.7.jar。编译:FullClasspath包含~/.ivy2/cache下的所有libraryDependencies jar位置。

  • 问题内容: 我经常发现自己想要这样做。当您要存储一些有用的信息或其他状态时,它可能非常有用。 所以我的问题是,是否有很好的理由来禁止这样做? 谢谢 编辑:非常感谢所有这些答案。因此,听起来这没有正确或错误的答案。 假设我接受这些类都不是子类的事实,那么 不 将Control类标记为final,而是禁止子类的意义是什么-有效地将异常/错误从编译时降级为运行时? 编辑^ 2:对此,请参阅我自己的回答:

  • 在spring boot 1.1.5和1.1.6中都有这个问题--我正在使用@value注释加载一个类路径资源,当我从STS(3.6.0,Windows)中运行应用程序时,它可以正常工作。但是,当我运行一个mvn包,然后尝试运行jar时,我得到了FileNotFound异常。 资源message.txt位于src/main/resources中。我已经检查了jar,并验证它在顶层(与applica