java反射获取父类的默认属性

除了私有属性不可访问,默认、protected、public都可以访问。

如下图,priName是父类的私有属性,子类对象s就不能访问priName,但是可以访问默认属性name

在HashMap中,Node的内部属性都是默认的。HashMap和LinkedHashMap又在同一个包java.util.*下面,所以LinkedHashMap.Entry可以访问到HashMap.Node。

LinkedHashMap.Entry继承自HashMap.Node,其内部属性都是默认的。

HashMap.TreeNode继承自LinkedHashMap.Entry,内部属性也是默认的。

所以TreeNode理论上应该能够访问到父类所有的属性。HashMap.Node不是public,所以程序员不能直接获取HashMpa.Node对象。问题不大用反射看看所有的可访问的默认属性:

    public static void main(String[] args) {
    
    
        try {
    
    
            Class cls = Class.forName("java.util.HashMap$TreeNode");
            while (!Object.class.equals(cls)) {
    
    
                System.out.println(cls.getSimpleName()+": ");
                Field[] temp = cls.getDeclaredFields();
                for (Field f : temp) {
    
    
                    String modifier = Modifier.toString(f.getModifiers());
                    if (!modifier.contains("private")&&!modifier.contains("protected")&&!modifier.contains("public")) {
    
    
                        if (!f.getName().startsWith("$")) {
    
     //过滤掉 $assertionsDisabled
                            System.out.print(f.getName() + " ");
                        }
                    }
                }
                System.out.println();
                cls = cls.getSuperclass();
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
	}

运行结果:

猜你喜欢

转载自blog.csdn.net/zhangjin1120/article/details/121302731
今日推荐