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..........

java Field 二三事

时间: 2024-10-22 09:10:55

java Field 二三事的相关文章

程序猿二三事之Java基础--Java SE 5增加的特性--语法篇(一)

程序猿二三事之Java基础–Java SE 5增加的特性–语法篇(一) [ TOC ] 为什么是Java SE 5? 目前已经到了JDK-8u74了,JDK7的主版本已经于2015年4月停止公开更新. 那为什么还要来说Java/JDK5呢? Java SE在1.4(2002)趋于成熟,随着越来越多应用于开发企业应用,许多框架诞生于这个时期或走向成熟. Java SE 5.0的发布(2004)在语法层面增加了很多特性,让开发更高效,代码更整洁. 自动装箱/拆箱.泛型.注解.for循环增强.枚举.可

Java中的匿名内部类及内部类的二三事

匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实参列表){ //匿名内部类的类体部分 } 从定义来看,匿名内部类必须继承一个父类,或者实现一个接口,但是最多只能继承一个父类或者实现一个接口. 关于匿名内部类,还有如下两条规则: 匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象.因此不允许将匿名内部类定义成抽象类. 匿

Java进阶(二十五)Java连接mysql数据库(底层实现)

Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜索.特将之前使用的方法做一简单的总结.也能够在底层理解一下连接数据库的具体步骤. 实现 首先需要导入相关的jar包,我使用的为:mysql-connector-java-5.1.7-bin.jar. 下面来看一下我所使用的数据库连接方法类: MysqlUtil.java package cn.edu

程序员英语二三事(4) - 应聘外企常用英语(1) - 从投简历开始

这是<程序员英语二三事>系列文章之一. 应聘外企会有如下几个环节: 投递简历 电话通知或电话面试 现场面试. 拿到Offer入职. 先从投简历开始说起. Resume:你的简历 CV / Cover Letter: 很久很久以前,外国在没有互联网的时候,因为地广人稀,是用传统的信件来应聘.那时候会针对具体每个职位写一封应聘信,附在简历上面.这就是Cover Letter,简称CV.这个传统在互联网时代延续下来了. 那么Resume和CV的区别是什么呢?Resume是通用的简历,每个职位你都可以

Spark用Java实现二次排序的自定义key

本人在研究Spak,最近看了很多网上的对于SPARK用Java实现二次排序的方法,对于自定义key的做法 基本上都是实现Ordered<>接口,重写$greater.$greater$eq.$less.$less$eq.compare.compareTo方法,定义hashCode.equals····· 感觉好麻烦,其实我们自定义key只是用了里面的compareTo方法,其他的$greater.$greater$eq.$less.$less$eq.compare 不用做任何改动,hashCo

Java实现二维码技术探讨。

Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 能够用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourceforge.net/

初识zabbix需了解的二三事

简介 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案: zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题: 监控平台的组成 数据采集 --> 数据存储 --> 数据展示和分析 --> 报警 常见监控实现方案对比 cacti 优点:利用rrdtool绘图,图形美观: 缺点:报警功能薄弱,不适合大规模监控场景: nagios 优点:报警功能强大: 缺点:只关心正常与否的状态,数

Ubuntu12.04 Version 安装二三事

Ubuntu12.04 Version 安装二三事 安装输入法 因为是全英的系统,所以,中文输入法是一定要装的!!! 介绍一:(和我电脑配置很像,from http://vb2005xu.iteye.com/blog/1748575) Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等.其中Scim和Ibus是输入法框架. 在Ubuntu的中文系统中自带了中文输入法,通过Ctrl+Space可切换中英文输入法.这里我们主要说下Ubuntu英文系统

Java实验二实验报告:java面向对象程序设计

java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如“查网络”.“问