Java反射(三)在运行时利用反射分析对象

在运行时利用反射分析对象,其实就是利用反射来获得或者设置类的域。举例如下:

有一个Student类:

package testreflection;

public class Student {
	private String stuNum;

	public Student(String stuNum) {
		// TODO Auto-generated constructor stub
		this.stuNum = stuNum;
	}
}

利用反射来获得和设置Student类的stuNum域的测试代码如下:

package testreflection;

import java.lang.reflect.Field;

public class ObjectAnalyzerTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student student = new Student("20101120244");
		Class cl = student.getClass();
		try {
			Field field = cl.getDeclaredField("stuNum");
			// 这一句对于访问私有域的值是必须的
			field.setAccessible(true);
			// 获得域
			Object object = field.get(student);
			System.out.println(object);

			// 设置域
			field.set(student, "20121120064");
			Object object1 = field.get(student);
			System.out.println(object1);
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

运行ObjectAnalyzerTest结果如下:

20101120244

20121120064

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 07:00:01

Java反射(三)在运行时利用反射分析对象的相关文章

[译文]运行时利用反射动态地创建类的实例

介绍 通常我们使用类的名称创建一个实例/类的对象,例如,如果我有一个名为 User 的类,我们会去这样创建这个类. 1 User UR = new User(); 2 UR.ID = 1; 3 UR.Name = "Kailash"; 但如果有人你在让你在应用程序运行时或者通过字符串作为类名创建一个类的实例,你将如何做? 别担心,微软.Net 框架提供了一种解决方案. 在System.Reflection名称空间的 Assembly类和System名字空间的和Activator 类可以

JAVA自定义注解 和 运行时靠 反射获取注解,解决 shiro 注解型权限因子获取问题

项目的权限分配,采用的是RBAC的设计模式.后台配置权限的时候,需要获取到所有的权限因子. 不经让我想起YII框架的SRBAC模块,还有以前的一个ecshop改造系统的权限配置方式,都采用的是PHP的反射机制. 于是把PHP项目的经验带到JAVA项目中,发现PHP中的经验在java中,实现起来不是那么的方便. 这主要的原因:一是语言上的特性导致权限控制方面的差异性. 二是项目使用的是SSH框架,action的名称已经使用注解替换了原有名称.使用反射获取到的类名和方法名组合,不是有效的权限因子(当

java 反射机制:运行时的类信息(为框架服务的Bug存在)

反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 换一种引出反射的说法是:当通过反射与一个未知的类型的对象打交道是,JVM只是简单地检查这个类,看它是属于哪个特定的类(就想RTTI那样).在用它做其他事情之前必须先加载那个类的Class对象.因此,那个类的.class文件对于JVM来说必须是可获取的:那么在本地机器上,要么通过网络获得

Java的反射与RTTI(运行时类型信息)的区别

重要的事情说三遍: 反射并没有什么神奇之处!反射并没有什么神奇之处!反射并没有什么神奇之处! 当通过反射与一个未知类型的对象打交道时,JVM只是简单地检查这个对象,看它属于哪个特定的类(和RTTI一样).在用它做其他事情之前必须先加载那个类的class对象. 那个类的class文件要么存在于本地,要么在网络上. 仅此而已. 反射和RTTI的区别就是何时获得和打开class文件. RTTI在编译时打开和检查class文件.(换句话说,我们以普通的方式调用对象的方法) 反射在运行时打开和检查clas

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java基础之RTTI 运行时类型识别

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于RTTI实现的.RTTI的功能主要是由Class类实现的. Class类 Class类是"类的类"(class of classes).如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合. 每一个Class类的对象代表一个其他的类.比如下面的程序中,Class类的对象c1代

Java虚拟机学习--记录运行时数据区域

为方便后面学习的理解,记录一下! 运行时数据区 1.线程共享 1.1方法区(Method Area) 1.1.1运行时常量池(Runtime Constant Pool) 1.2堆(Heap) 2.线程私有 2.1虚拟机栈(VM Stack) 2.2本地方法栈(Native Method Stack) 2.3程序计数器(Program Counter Register) 3.直接内存(Direct Memory) 虚拟机栈: 线程私有,生命周期与线程同步,用来执行Java方法. 每个java方法

深入理解Java虚拟机读书笔记---运行时数据区域

运行时数据区域 1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成.由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令.因此,为了线

Java虚拟机OOM之运行时常量池溢出(5)

如果要向运行时常量池中添加内容,最简单的做法就是使用 String.intern()这个 Native 方法.该方法的作用是:如果池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的String 对象:否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用.由于常量池分配在方法区内,我们可以通过-XX:PermSize 和-XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量代码运行时常量池导致的内存溢出异