方法、字段名最大长度是多少?
65535
因为CONSTANT_Utf8_info 表中length 类型为u2,而所有方法、字段都需要引用CONSTANT_Utf8_info 型常量来描述名称,所以最大只能65535
类的单继承、实现多接口及接口多继承
Class文件格式中,super_class数量仅为1,且除java.lang.Object,所有java的父类都不为0,即都有父类。
而接口有interfaces_count类型和interfaces
jclasslib验证
测试代码:
public interface InterfaceTest extends InterfaceTest1, InterfaceTest2{
}
interface InterfaceTest1 {
}
interface InterfaceTest2 {
}
jclasslib查看:
final修饰基本数据类型和String
final修饰的基本数据类型和String,不需要去初始化执行代码的,会在Fields下有ConstantValue的属性。属于编译前期优化,加载前值便初始化了。
测试代码:
public class FinalTest {
final int i = 10;
final double d = 10.0;
final String str = "str";
final int i2 = new Integer("10");
final int i3 = new Random().nextInt(10);
final String str2 = new String("str");
}
jclasslib查看:
JDK5 新增Signature属性
java范型采用的是擦除法实现,此属性为了避免类型信息被擦除后导致签名混乱而设计。可用于运行期反射获取范型信息。
同样方法中使用LocalVariableTypeTable属性,使用字段的特征签名来完成范型描述。
测试代码:
public class SignatureTest {
List<String> list1;
public void test(List<String> list) {
list = new ArrayList<>();
}
}
jclasslib验证:
实例方法第一个参数为this,类方法则没有
测试代码:
public class ThisTest {
public void test() {}
public static void test1(){}
}
jclasslib验证
同步指令
synchronized修饰方法, ACC_SYNCHRONIZED访问标志为true,执行线程要求先成功持有管程,然后才能执行方法;最后当方法完成(正常或异常),释放管程。
synchronized同步代码块,java虚拟机指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义。
测试代码:
public class SynchronizedTest {
public synchronized void test(){}
public void test1() {
synchronized (SynchronizedTest.class) {
System.out.println(1);
}
}
}
参考《深入理解java虚拟机》