zoukankan      html  css  js  c++  java
  • Java反射学习之Field类访问和修饰变量

    Field类提供访问类成员属性和值一系列方法,最常用的就是访问成员变量值和修改变量值.

    众所周知,变量修饰符有pubilc,protected,default,private,修饰符提供的访问权限依次变小,private修饰的只能本类中访问,但是,通过java.lang.reflet.Field类就能访问和修改private修饰的私有变量了,example如下:

    等待被访问Person类及其变量:

    public class Person {
        
        public String name = "graham";
        protected String sex = "男";
        String province = "天津";
        private int age = 26;
    
    }

    通过Field类的get(Object ojb)和set(Object ojb, Object value),访问和修改Person类的共私有成员:

    public class TestClass {
        public String aa ="aaa";
        private String bb = "bbb";
        protected String cc = "ccc";
    
        public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
            Person person = new Person();
    
            //访问公有成员用getField或者getDeclaredField
            Field field  = person.getClass().getField("name");
            field.set(person, "grahamliu");
            System.out.println(field.get(person));
    
            //访问非公有成员必须用getDeclaredField
            Field field1  = person.getClass().getDeclaredField("sex");
            field1.set(person, "女");
            System.out.println(field1.get(person));
    
            Field field2  = person.getClass().getDeclaredField("province");
            field2.set(person, "南极");
            System.out.println(field2.get(person));
    
            //访问和修饰private变量,必须设置setAccessible为true
            Field field3  = person.getClass().getDeclaredField("age");
            field3.setAccessible(true);
            field3.set(person, 87);
            System.out.println(field3.get(person));
    
            //访问本类private变量,不用设置setAccessible
            Field field4 = TestClass.class.getDeclaredField("cc");
            System.out.println(field4.get(new TestClass()));
        }
    }

    打印:

    /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA 
    grahamliu
    女
    南极
    87
    ccc
    
    Process finished with exit code 0

    涉及2个知识点:

    1.访问公有成员用getField或者getDeclaredField,访问非公有成员必须用getDeclaredField

    2.访问和修饰private变量,必须设置setAccessible为true,本类除外!

  • 相关阅读:
    codevs 1792 分解质因数
    ScrollView嵌套ViewPager,ViewPager内容不显示问题
    AndroidStudio不重新运行,Debug调试已有进程
    Android进阶之Fragment与Activity之间的数据交互
    Android修改包名的方法,简单粗暴。
    android studio 按钮运行按钮后,不弹出选择运行模拟器的对话框
    RGB颜色值与十六进制颜色码转换工具
    Android Studio查看其它APP的布局结构
    android实现多条件筛选列表菜单筛选菜单
    Android,一条线串联实心圆布局
  • 原文地址:https://www.cnblogs.com/u1s1/p/12435859.html
Copyright © 2011-2022 走看看