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 二三事的更多相关文章
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- Java中的匿名内部类及内部类的二三事
匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- 一只代码小白git托管路上的二三事
[经验]一只代码小白git托管路上的二三事 写在前面的话 寒假的时候,娄老师给我们布置了代码托管的作业,并要求把托管地址发给学委.因假期的时候没有带电脑回家,所以只是在手机上草草注册了,也稀里糊涂就将 ...
- Java EE : 二、图解 Cookie(小甜饼)
目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.概述 二.详细介绍Cookie 传输 ...
- 利用JAVA生成二维码
本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...
- java实现二维码
说起二维码,微信好像最先启用,随后各类二维码就开始流行起来了.那什么是二维码呢. 1.什么是二维码?百度一下即可 http://baike.baidu.com/view/132241.htm?fr=a ...
- linux杂记(十二?) 关于账号和密码的二三事
关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
随机推荐
- hdu 5762 Teacher Bo 暴力
Teacher Bo 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5762 Description Teacher BoBo is a geogra ...
- 如何使用windows云服务器搭建IIs、windows服务
如何使用windows云服务器搭建IIs.windows服务,以下针对腾讯云服务器进行说明 1.购买云服务器之后,第1步需要设置的是,找到重装系统.重置密码等处. 2.设置安全组,设置完安全组之后才能 ...
- 基于设备树的TQ2440 DMA学习(4)—— client驱动
作者 彭东林pengdonglin137@163.com 平台 TQ2440Linux-4.9 概述 前面分析了DMA控制器驱动,下面我们调用DMAENGINE的API写一个MEM2MEM的驱动 正文 ...
- AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件
本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI- ...
- 在ASP.NET MVC中使用Knockout实践08,使用foreach绑定集合
本篇体验使用 foreach 绑定一个Product集合. 首先使用构造创建一个View Model. var Product = function(data) { this.name = ko.ob ...
- iOS 程序插件及功能动态更新思路
所用框架及语言 iOS客户端-Wax(开发愤怒的小鸟的连接Lua 和 Objc的框架),Lua,Objc, 服务端-Java(用于返回插件页面) 工具框架链接地址:Wax - https://gith ...
- Xcode 统计项目代码行数及常用快捷键
1.统计Xcode项目代码行数 1 打开终端. 2 用ls和cd进到你项目的路径. 3 输入下面的指令: grep -r "\n" classes | wc -l (cl ...
- C++ inline内联函数
inline 函数避免函数调用的开销 // find longer of two strings const string &shorterString(const string &s ...
- 打电话时InCallScreen的具体流程 之 来电不锁屏
打电话时InCallScreen的具体流程 前面说到OutgoingCallReceiver解析号码并启动incallscreen类,第一次启动时首先进入了其oncreate方法 (1)初始化Phon ...
- .NET:分布式事务
背景 分布式事务使用起来比较方便,不过也是有成本的,因此如果可以不用就尽量不用,比如:采用saga.如果采用了分布式事务的话,就需要对分布式事务相关的几个概念有所了解. 分布式事务 相关角色: 事务发 ...