我想了解JVM何时调用ClassLoader的checkPackageAccess方法。从javadoc中,我读到在用类加载器加载类之后,JVM调用了它。但是我发现有时在装入一个类后会多次调用它。 JVM根据什么决定决定调用它。如果有人可以澄清该方法,我将不胜感激。
为了更容易理解,这是我所做的:
<clinit>
,而在另一次运行中,则没有。 使用<clinit>
进行的运行如下所示:
Run with clinit
没有这样的人: Run without clinit
因此,您可以看到,在装入checkPackageAccess
之后,没有clinit的运行导致对java.sql.DriverPropertyInfo
的三个调用,而正常运行(带有clinit的运行)仅导致一个调用。由于在两次运行中都未执行<clinit>
(第二次运行中都不是原始运行,也不是空运行),所以我想知道是什么导致JVM执行此checkPackageAccess
调用。
checkPackageAccess
用于java.sql.DriverPropertyInfo
(在java.util.concurrent.ConcurrentHashMap
java.lang.ref.ReferenceQueue
我使用JVMTI methodEntry和methodExit事件来生成所有正在发生的事件的跟踪。但是,我无法解释是什么导致了这些额外的checkPackageAccess
调用。