我正面临一个需要在非常旧的系统上运行的遗留应用程序(Java 1.4)。我需要覆盖一个返回GridBagLayoutInfo对象的受保护方法(GridBagLayout.GetLayoutInfo)。问题是GridBagLayoutInfo类本身是封装私有的,直到Java 1.6(然后它被公开)。
所以让我们来看看这段代码:
import java.awt.Container;
import java.awt.GridBagLayout;
import java.awt.GridBagLayoutInfo;
public class GridBagLayoutSubclass extends GridBagLayout
{
protected GridBagLayoutInfo GetLayoutInfo(Container parent, int sizeflag)
{
System.out.println("Foo");
return super.GetLayoutInfo(parent, PREFERREDSIZE);
}
public static void main(String args[]) throws Exception
{
(new GridBagLayoutSubclass()).GetLayoutInfo(new Container(), 1);
}
}
我可以在"现代" Java系统。令我惊讶的是,生成的类文件在目标Java系统(Java 1.4)上工作,即使GridBagLayoutInfo类在该运行时环境中是包私有的。为什么会这样? JVM是否在运行时检查类型的可见性?