zoukankan      html  css  js  c++  java
  • 5、获取Class中的字段

    5、获取Class中的字段

    5.1 getField(String name) 只获取共有的字段

    • 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
    /**
     * 获取字节码文件的字段
     */
    @Test
    public void getFieldDemo() throws Exception {
    
        Class clazz = Class.forName("com.hw.bean.Person");
        Field name = clazz.getField("name");
        System.out.println(name);
    }
    

    运行:

    报错,原因是字段是私有的。

    要反映的字段由以下算法确定。 让C成为由该对象表示的类或接口:

    • 如果C声明一个具有指定名称的公共字段,那就是要反映的字段。
    • 如果在上述步骤1中没有找到字段,则将该算法递归地应用于C的每个直接超级接口。直接超级接口按照它们被声明的顺序被搜索。
    • 如果在上面的步骤1和2中没有找到字段,并且C具有超类S,则该算法在S上递归地调用。如果C没有超类,则抛出NoSuchFieldException 。

    5.2 getDeclaredField(String name) 只获取本类 但包含私有

    @Test
    public void getFieldDemo() throws Exception {
    
        Class clazz = Class.forName("com.hw.bean.Person");
    
        Field field = // clazz.getField("name");
                clazz.getDeclaredField("name");
        Object instance = clazz.newInstance();
        Object age = field.get(instance);
    }
    

    运行:

    还是报错,不能访问私有的

    5.3 java.lang.reflect.AccessibleObject

    • AccessibleObject类是Field,Method和Constructor对象的基类。 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能。
    • 当使用Fields,Methods或Constructors来设置或获取字段,调用方法,或创建和初始化新的类实例时,执行访问检查(对于public,默认(包)访问,受保护和私有成员)。
    5.3.1 setAccessible(boolean flag) 暴力访问
    • 将此对象的 accessible标志设置为指示的布尔值。
    @Test
    public void getFieldDemo() throws Exception {
    
        Class clazz = Class.forName("com.hw.bean.Person");
    
        Field field = // clazz.getField("name");
                clazz.getDeclaredField("name");
        // 对私有字段的访问取消权限检查。暴力访问
        field.setAccessible(true);
        Object instance = clazz.newInstance();
        // 对字段赋值
        field.set(instance,"张四");
        Object name = field.get(instance);
        System.out.println(name);
    }
    

    运行:


    本章节源码: ReflectDemo3

  • 相关阅读:
    微软企业库调用Oracle存储过程返回(1个或多个)数据集
    (转)Oracle表空间
    HTML5操作
    完美实现 ASP.NET 2.0 中的URL重写伪静态(映射) >(转载)的简介与内容
    HTML5 audio 详解
    步步为营:Asp.Net使用HttpWebRequest通知,抓取,采集(转)
    js cookie操作
    多线线程
    js with用法
    asp.net AllowSorting="true"仍然不能排序的原因
  • 原文地址:https://www.cnblogs.com/Grand-Jon/p/10041963.html
Copyright © 2011-2022 走看看