JAVA反射机制定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
本笔记讲述如何使用反射获取一个类的所有字段并改变其内容。
import java.lang.reflect.Field;
/**
* JAVA反射的演示2
* 本测试类演示Filed属性字段的反射
* --1 调用一个类的公开字段输出信息并改变其值
* --2 调用一个类的私有字段输出信息并改变其值
* --3 调用一个类的静态字段输出信息并改变其值
* @author Eric
*
*/
public class ReflectDemo2Field {
public static void main(String args[]) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
ReflectDemo2FieldBeanClass demo = new ReflectDemo2FieldBeanClass();//测试用类
Class testC1=demo.getClass();
Field[] fs = testC1.getDeclaredFields();//与getFields区别是,getFields只能访问公开属性
//--1 调用一个类的公开字段输出信息并改变其值
Field f1 = testC1.getDeclaredField("publicField");
outField(f1,demo);
System.out.println("---------------内容改变后--------------");
f1.set(demo, "publicField"); //改变其值
outField(f1,demo);
System.out.println("---------------测试结束--------------");
//--2 调用一个类的私有字段输出信息并改变其值
Field f2 = testC1.getDeclaredField("privateField");
f2.setAccessible(true);//访问有权限的字段时,需使用此方法设置访问性,否则会因为权限不够无法访问。
outField(f2,demo);
System.out.println("---------------内容改变后--------------");
f2.set(demo, "privateField");
outField(f2,demo);
System.out.println("---------------测试结束--------------");
//--3 调用一个类的静态字段输出信息并改变其值
Field f3 = testC1.getDeclaredField("staticField");
outField(f3,demo);
System.out.println("---------------内容改变后--------------");
f3.set(demo, "staticField");
outField(f3,demo);
System.out.println("---------------测试结束--------------");
}
public static void outField(Field f1,Object obj){
Field field = f1;
System.out.println("名称为:"+field.getName());
Class fieldType = field.getType();
System.out.println("类型为:"+fieldType.getName());
Object data=null;
try {
data = field.get(obj);//输出字段值
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("内容为:"+data.toString());
}
}
测试结果如下:
-
名称为:publicField
类型为:java.lang.String
内容为:原始数据Public字段
---------------内容改变后--------------
名称为:publicField
类型为:java.lang.String
内容为:publicField
---------------测试结束--------------
-
名称为:privateField
类型为:java.lang.String
内容为:原始数据private字段
---------------内容改变后--------------
名称为:privateField
类型为:java.lang.String
内容为:privateField
---------------测试结束--------------
-
名称为:staticField
类型为:java.lang.String
内容为:原始数据static字段
---------------内容改变后--------------
名称为:staticField
类型为:java.lang.String
内容为:staticField
---------------测试结束--------------
测试模型如下:
/**
* 用于测试反射的bean class
*
* @author Eric
*
*/
public class ReflectDemoBeanClass {
public String publicField = "原始数据Public字段";
private String privateField = "原始数据private字段";
static String staticField = "原始数据static字段";
}
作业:试试写出可以输出任意一个类的所有字段的toString方法的方法。
参考答案1:
/**
* 一次性输出所有字段的值
*/
public String toString() {
Class cl = this.getClass();
Field[] fs = cl.getDeclaredFields();
StringBuilder str = new StringBuilder();
str.append("类" + cl.getName() + "\t 内部属性与值如下:\n");
for (Field f : fs) {
str.append(f.getName() + " : ");
try {
str.append(f.get(this).toString());
} catch (IllegalArgumentException | IllegalAccessException e) {
str.append("null");
}
str.append("\n");
}
str.append("----------------模型描述完成----------------");
return str.toString();
}
分享到:
相关推荐
JAVA学习经典笔记-----1JAVA学习经典笔记-----1JAVA学习经典笔记-----1JAVA学习经典笔记-----1JAVA学习经典笔记-----1
java学习——java中的反射学习笔记
zookeeper云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-...
Qt5学习笔记——QRadioButton与QButtonGroup - R先生一天不学习就浑身难受 - CSDN博客1
S7-200 Smart入门笔记2——读时钟 S7-200 Smart入门笔记3——呼吸灯 S7-200 Smart入门笔记4——全局变量和局部变量 S7-200 Smart入门笔记5——子程序 S7-200 Smart入门笔记6——中断1 S7-200 Smart入门笔记7——中断...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
java从入门到精通学习笔记-Lesson2(面向对象下).pdf
——————————————————————————————————————————————
java从入门到精通学习笔记-Lesson5(多线程).pdf
JAVA学习笔记-java学习笔记WORD样式.docx
良葛格————JavaJDK5.0学良葛格————JavaJDK5.0学习笔记PDF.rar习笔记PDF.rar良葛格良葛格————JavaJDK5.0学习笔记PDF.rar————JavaJDK5.0学习笔记PDF.rar良葛格————JavaJDK5.0学习笔记PDF.rar良...