java 反射
来源:互联网 发布:手机淘宝店铺公告设置 编辑:程序博客网 时间:2024/05/16 12:25
Java代码
- public class ReadOnlyClass {
- private String name = "hello";
- public String getName(){
- return name;
- }
- }
问题:能否将ReadOnlyClass 类的一个对象,把它的name属性的值由hello改为world?如果能,请写出实现代码。如果不能请说明理由。
解答:可以。利用java的反射。
分析:任何一个类,我们可以得到它运行时的Class实例,对于ReadOnlyClass 类,我们可以通过ReadOnlyClass .class得到它运行时的Class实例,接着我们可以通过该类的Class实例去获得这个name这个属性所对应的Field对象。我们知道对应一个 类的属性都有一个和它相关的Field对象存在,对于构造方法来说有一个Constructor对象存在,对于一个方法来说有一个对应的Method对象 存在。通过这些我们可以利用发射来给这些属性动态的赋值。
实现代码如下:
Java代码
- public class ReadOnlyClassByReflection {
- public static void main(String[] args)throws Exception {
- ReadOnlyClass pt = new ReadOnlyClass();
- Class<?> clazz = ReadOnlyClass.class;
- Field field = clazz.getDeclaredField("name");
- field.setAccessible(true);
- field.set(pt, "world");
- System.out.println(pt.getName());
- }
- }
获得某一个类它的class对象有4种方式:
1、使用类的.class语法
2、通过类的对象的getClass()方法。getClass()方法在Object类里面定义的。
3、通过Class对象的forName()方法
4、对于包装类,可以通过.TYPE语法方式
通过类的反射机制,我们可以去改变只读的private的属性的值。
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- 基于Windows Azure 搭建基于SharePoint 2010 Intranet、Extranet、Internet (4): 配置传出邮件服务: 使用 outlook.com 发送邮件通知
- C# 使用资源文件 Resource.resx 的方法
- doxygen注释语法(一):JavaDoc注释风格、文件头和类注释
- final
- 自定义ISAPI Filter中发现的一个与Keep-Alive相关的Bug
- java 反射
- 北京与硅谷的创新差异
- 新软件马上就要完成了,先发篇文章YY下
- ORACLE 安装及安装注意事项
- visio绘图只显示一部分
- 关于键盘录入的问题
- FTP获取中文文件名乱码问题
- 注定“孤独”的魅族
- Ubuntu12.04下安装sourcenavigator-NG4.5阅读源代码