Java反射机制实战——字段篇
首先,我们来认识几个类。
Class(java.lang.Class)
Class对象是一个特殊对象,每一个类都有一个Class对象,用来创建该类的“常规”对象。可以通过对象的getClass()方法获取。
比如我们运行这一行代码:
System.out.println("测试".getClass().toString());
得到的结果就是:
class java.lang.String
Field(java.lang.reflect.Field)
这个类表示一个字段,可以使用这个字段来访问类
下面,我们来创建测试类:
class Book {
public String title;
public int length = 0;
public ArrayList<Page> pages = null; @Override
public String toString() {
String sb = "Book:\n";
sb += "title="+title+"\n";
sb += "length=" + length + "\n";
sb += "pages=" + pages + "\n";
if (pages != null) {
for (Page page : pages) {
sb += page.toString();
}
}
return sb.toString();
}
} class Page {
@Override
public String toString() {
return "page\n";
} }
调用以下方法来测试上面的类:
Book book = new Book();
System.out.println(book);
它的结果是这样:
Book:
title=null
length=0
pages=null
这是book对象的初始状态
我们下面通过反射机制,获取book对象中的length字段并进行修改,查看结果:
Book book = new Book();
Class<?> aClass = book.getClass();
Field field = aClass.getField("length");
field.setInt(book, 9);
System.out.println(book);
可以看到运行结果是:
Book:
title=null
length=9
pages=null
可以看出,length字段的值已经被修改了。
上面修改的是int型的简单字段,事实上像title字段这样的对象字段也是可以修改的,下面是示例:
Book book = new Book();
Class<?> aClass = book.getClass();
Field[] fields = aClass.getFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.getType().equals(String.class)){
field.set(book, "格林童话");
}else if(field.getType().equals(int.class)){
field.set(book, 199);
}
}
System.out.println(book);
上面的代码输出结果是:
Book:
title=格林童话
length=199
pages=null
事实上,是将所有String类型的字段都修改成“格林童话”,将所有int类型字段都修改成199 。我们甚至根本不知道这个字段代表什么意思。
下面,我们对pages这个字段进行修改。这个字段是个ArrayList,我们将创建一个ArrayList对象,并向其中插入一个对象。
Book book = new Book();
Class<?> aClass = book.getClass();
Field[] fields = aClass.getFields();
for (Field field : fields) {
field.setAccessible(true);
if(field.getType().equals(ArrayList.class)){
String genric = field.getGenericType().toString();
String genricClass = genric.substring(
genric.indexOf('<') + 1,
genric.indexOf('>'));
Class<?> entityClass = Class.forName(genricClass);
Object obj = entityClass.newInstance();
ArrayList list = new ArrayList();
list.add(obj);
field.set(book, list);
}
}
System.out.println(book);
输出结果如下:
Book:
title=null
length=0
pages=[page
]
Page
可以看出,尽管我们根本没有直接使用Page类,但还是创建出了一个Page对象。
Page对象的创建语句在:entityClass.newInstance()这一句。newInstance语句是Class对象的重要方法,用来创建这个类对应的对象。当然,需要类的构造方法支持。另外,通过genGenericType方法,我们可以获取到字段的类型修饰符。放在这里,获取到的就是ArrayList<Page>。有了这一个字符串,我们就可以通过类加载器Class.forName来加载Page类并创建一个Page对象了。
Java反射机制实战——字段篇的更多相关文章
- 文末送书四本 | 这篇Java反射机制太经典!不看后悔!
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...
- 11.Java反射机制 哦对了,前面的序号来自随笔关于编程之路的思索第一篇
基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...
- Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)
目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...
- Java 反射机制[Method反射]
Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPerso ...
- 详解Java反射机制
反射是程序在运行状态下,动态的获取某个类的内部信息的一种操作.例如:类名,包名,所有属性的集合,所有方法的集合,构造方法的集合等.该操作发生在程序的运行时状态,所以编译器管不着有关反射的一些代码,通常 ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
- Java反射机制Reflection
Java反射机制 1 .class文件 2 Class类 3 Class类与反射机制 4 Java反射机制的类库支持及简介 5 反射机制的定义与应用 6 反射机制Demo Java反射机制demo(一 ...
- java反射机制的进一步理解
承上一篇. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- Java技术——Java反射机制分析
)生成动态代理. 2. Java反射API 反射API用来生成在当前Java虚拟机中的类.接口或者对象的信息. Class类:反射的核心类,可以获取类的属性,方法等内容信息. Field类:Java. ...
随机推荐
- 关于warning
IT男正吸着雪茄,吐着烟圈.他女朋友生气了发飙道:“你没看见包装盒上的警告(Warning)么?吸烟有害健康!” IT男淡定地回答道:“我是程序员.我们不关心警告,只关心错误.”
- 如何查看sqlalchemy执行的原始sql语句?
SQLAlchemy打开SQL语句方法如下,echo=true将开启该功能: engine = create_engine("<db_rul>", echo=True) ...
- 当遇到Mac的Excel或者Word老是重复崩溃的时候
打开Number,新建文件然后导出为Excel.之后再用Excel打开,一切都OK了.
- MapReduce获取分片数目
问题 MapReduce Application中mapper的数目和分片的数目是一样的,可是分片数目和什么有关呢? 默认情况下.分片和输入文件的分块数是相等的.也不全然相等,假设block size ...
- [React] Build a slide deck with mdx-deck using Markdown + React
In this lesson we'll use mdx-deck to create a slide deck using Markdown and React. We'll look at add ...
- Gulp安装及使用
測试环境 Mac:10.10.4 Gulp:3.9.0 时间:2015年08月15日18:07:08 安装Gulp sudo npm install --global gulp npm install ...
- ionic/cordova 真机调试
android下简单,连接手机后,直接: myProjectPath>ionic run android ios下比较麻烦点,要先装ios-deploy: sudo npm install - ...
- HttpClient-01基本概念
Http 协议应该是互联网中最重要的协议.持续增长的 web 服务.可联网的家用电器等都在继承并拓 展着 Http 协议,向着浏览器之外的方向发展. 虽然 jdk 中的 java.net 包中提供了一 ...
- 【CSU 1803】2016
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 Solution: 考虑两个数x,y乘积%2016=0 x×y≡0(MOD 2016) x= ...
- zoj 3023 Light Bulb
题目大意: 求L的最大值 思路: 可以想象出是一个关于人到灯泡距离x的单峰上凸函数 当光线在墙角左边的时候影子在不断增长 然后通过相似可以推出人在墙上影子的长度为:H+D*(h-H)/x 再加上地上的 ...