java反射机制中的getDeclaredField()

news/2024/5/19 6:03:37 标签: java, getDeclaredField(), 反射

        反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。 

        如下为getDeclaredField()的一个实例:

java">package com.bijian.test;

import java.lang.reflect.Field;
import java.util.Date;

public class Program {

	public Program() {
	}

	public Program(String str, Date date, int i) {
		this.str = str;
		this.date = date;
		this.i = i;
	}

	private String str = "Hello";
	private Date date = new Date();
	protected int i = 0;

	public int getI() {
		return i;
	}

	public String getStr() {
		return str;
	}

	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {

		try {
			Program program = new Program();
			Class progClass = program.getClass();
			
			//在对象是未知的情况下,通过如下方法得到这个对象的所有属性值
			java.lang.reflect.Field[] fields = progClass.getDeclaredFields();
			for (java.lang.reflect.Field f : fields) {
				System.out.println(f.getName());
			}

			// 通过反射机制,获取到类Program中的str
			Field strField1 = progClass.getDeclaredField("str");
			// 输出private java.lang.String Program.str
			System.out.println("Field found: " + strField1.toString());

			// 同上
			Field dateField = progClass.getDeclaredField("date");
			System.out.println("Field found: " + dateField.toString());
			// 同上
			Field iField = progClass.getDeclaredField("i");
			System.out.println("Field found: " + iField.toString());

			// 我想说的是这一点,这里能获取到类Program中的str并对其修改。
			// Program类中没有对str设置的setStr()方法,而且使用了private,
			// 这是不允许访问的。
			// 但是我们能通过反射机制,从而获取private类型的值,并直接改。
			Field strField = progClass.getDeclaredField("str");
			strField.set(program, "我是Str字符串。");
			// 输出:我是Str字符串。
			System.out.println(program.getStr());

		} catch (NoSuchFieldException ex) {
			System.out.println(ex.toString());
		}
	}
}

运行结果:

str
date
i
Field found: private java.lang.String com.bijian.test.Program.str
Field found: private java.util.Date com.bijian.test.Program.date
Field found: protected int com.bijian.test.Program.i
我是Str字符串。

 

文章来源:http://my.oschina.net/swords/blog/117357


http://www.niftyadmin.cn/n/1317023.html

相关文章

Collection集合 总结笔记

2:Set集合(理解) (1)Set集合的特点 无序,唯一 (2)HashSet集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法:hashCode()和equals() 执行顺序: 首先比较哈希值…

Netty源码分析之流水线

上一篇分析Netty线程模型,今天分析Netty另外一个重点流水线Pipe。 一、流水线处理逻辑 Netty把各个事件放到Pipe中,进行自动化处理,这个做法非常棒!!思想非常独特,使用者不需要关心是哪个事件&#xff1f…

docker基础命令行

本篇适合于对docker有一定了解的同学,如果不知道docker是什么,有哪些特点请自行百度。 一、image镜像相关 “镜像”这个词语应该很多人都知道,假设我们安装windows系统,一个windows iso文件,这个iso文件就是镜像文件。…

【C#】【Thread】SynchronizationContext线程间同步

SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯。 需要注意的是,不是每个线程都附加SynchronizationContext这个对象,只有UI线程是一直拥有的。故获取SynchronizationContext也只能在UI线程上进行…

用反射的方式获取父类中的所有属性和方法

用反射的方式获取父类中的所有属性和方法实例。 Parent.java package com.bijian.study;/*** 父类*/ public class Parent {public String publicField "1";String defaultField "2"; protected String protectedField "3";private String p…

Servletjsp基础:第一部分

使用Servlet激活器... 5 缺省Servlet6 Tomcat中的类装载器... 6 Servlet8 Servlet路径映射... 8 ServletConfig接口... 9 获取ServletContext对象(getServletContext)... 9 获取Servlet的注册名(getServletName)... 9 获取Servlet…

docker 私有仓库从无到有

今天介绍一下docker仓库。Docker的管理方式是照仿github管理方式,使用方式也和github类似。获取镜像是docker pull、发布镜像是docker push,保存镜像是docker commit。因此只要是熟悉git命令行,对于docker也就不默生了。由于dockerhub在国内访…

【笔记】Linux常用指令

查看历史记录前十条最常用的指令 history | awk {print $2} | sort | uniq -c | sort -rn | head -10查看系统、内核 cat /etc/redhat-release uname -r查看CPU、核数 grep "CPU" /proc/cpuinfo运行时间 uptime查看系统位数 getconf LONG_BIT查看硬盘和分区 df…