zoukankan      html  css  js  c++  java
  • java Field 二三事

      java在反射时候经常用到了 Field 类。

      我认为代码是最好的解释,直接上代码。

      首先,用到了一个bean类,源代码如下:

    package com.ncs;  
      
    public class Point {  
      
        private int x;  
        public int y;  
          
        public Point(int x, int y) {  
            super();  
            this.x = x;  
            this.y = y;  
        }  
          
    }  

      我这里说道的Field是由反射的开始,源代码如下:

    package com.ncs;  
      
    import java.lang.reflect.Field;  
      
    //need another bean Point  
    public class ReflectTest {  
        //★这里说的Field都是 类 身上的,不是实例上的  
        public static void main(String[] args) throws Exception {  
              
            Point pt1 new Point(3,5);  
              
            //得到一个字段  
            Field fieldY = pt1.getClass().getField("y"); //y 是变量名  
            //fieldY的值是5么?? 大错特错  
            //fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊  
            //不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值  
            //要这样  
            System.out.println(fieldY.get(pt1)); //这才是5  
              
            //现在要x了  
              
            /*  
            Field fieldX = pt1.getClass().getField("x"); //x 是变量名 
            System.out.println(fieldX.get(pt1));  
            */  
              
            //运行 报错 私有的,找不到  
            //NoSuchFieldException  
            //说明getField 只可以得到 公有的  
            //怎么得到私有的呢??  
              
            /* 
            Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来 
            //然后轮到这里错了 
            // java.lang.IllegalAccessException: 
            //Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private" 
            System.out.println(fieldX.get(pt1)); 
            */  
              
            //三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用  三是暴力抢了  
              
            //暴力反射    
            Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来  
            fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了  
            System.out.println(fieldX.get(pt1));   
              
            //out 3 OK!!  
              
              
        }  
    }  

      下面,我们做一个实例将把一个类里所有String类型的字段里的值 b 变 a 。实验的源代码如下:

      

    package com.ncs;  
      
    import java.lang.reflect.Field;  
      
    //need another bean Point  
    public class ReflectTest {  
          
        public static void main(String[] args) throws Exception {  
              
            Point pt1 new Point(3,5);  
              
            //get all fields  
            Field[] fields = pt1.getClass().getFields();   
              
            for(Field field : fields ) {  
                //我说的是String 类型的字段,当然要选择一下  
                //if(field.getType().equals(String.class)) {  
                //字节码都是一份的,干什么用equals啊  
                if(field.getType()== String.class) {  
                    String oldValue = (String)field.get(pt1);  
                    String newValue = oldValue.replace('b', 'a');  
                    //改 对象的字段  
                    field.set(pt1, newValue);  
                      
                }  
            }  
              
            System.out.println(pt1.s1);  
            System.out.println(pt1.s2);  
            System.out.println(pt1.s3);  
              
    
           }   }  

      这样就利用了Field很块的完成了任务。ok..........

  • 相关阅读:
    Spring Boot 无侵入式 实现 API 接口统一 JSON 格式返回
    Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
    排名前 16 的 Java 工具类
    万字详解,JDK8 的 Lambda、Stream 和日期的使用详解
    这样规范写代码,同事直呼“666”
    Java多线程高并发学习笔记——阻塞队列
    零散的MySQL基础总是记不住?看这一篇就够了!
    Java 中自定义注解及使用场景
    最简单的6种防止数据重复提交的方法!
    选择数据库联系人【选择之后将不在列表】
  • 原文地址:https://www.cnblogs.com/manuosex/p/3852716.html
Copyright © 2011-2022 走看看