性能问答>关于ClassLoader的resolveClass方法>
2回复
5月前

关于ClassLoader的resolveClass方法



有人关注过ClassLoader的resolveClass的实现么?在Java代码中如下:

/**
* Links the specified class. This (misleadingly named) method may be
* used by a class loader to link a class. If the class <tt>c</tt> has
* already been linked, then this method simply returns. Otherwise, the
* class is linked as described in the "Execution" chapter of
* <cite>The Java&trade; Language Specification</cite>.
*
* @param c
* The class to link
*
* @throws NullPointerException
* If <tt>c</tt> is <tt>null</tt>.
*
* @see #defineClass(String, byte[], int, int)
*/
protected final void resolveClass(Class<?> c) {
resolveClass0(c);
}

然后一路追到虚拟机中
https://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/prims/jvm.cpp

JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls))
  JVMWrapper("JVM_ResolveClass");
  if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
JVM_END
这里什么也没做啊? 而且我尝试翻了从jdk6到jdk8, 实现都是这样,这和Java代码中的"Links the specified class."是有明显出入的?有哪位大佬对于
这块比较熟悉的?还请赐教,感谢~





194 阅读
请先登录,再评论

Links the specified class 应该也是Java虚拟机规范中说到的连接,包括验证、准备和解释阶段,这也是resolveClass方法需要实现的逻辑。不过实现为空,可能是为了性能考虑吧,这些阶段能提早就提早做,比如在类加载时就会做验证,这样就在一次读取Class内容的过程中做了很多的事儿。有些变成了惰性处理,如直到执行到invoke系列字节码指令执行时才会解释,将符号引用变为直接引用。如果类的加载、类的连接和类的初始化等阶段都分的特别清楚的话,那这个resolve方法应该有实现

25月前
回复 鸠摩:

鸠摩大佬说的对,感觉InstanceKlass::initialize里面的InstanceKlass::link_class_impl才是真正实现Link Class的地方,但是确实有的验证已经在加载parseClassFile的时候已经做了,而initialize往往在初始化时或者InterpreterRuntime::_new之类的时候才触发。这个resolveClass0方法我一开始也没想明白有啥意义,现在看来应该只是遵循虚拟机规范留的口子😂。

5月前回复