博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 反射的一些思考
阅读量:5808 次
发布时间:2019-06-18

本文共 1382 字,大约阅读时间需要 4 分钟。

hot3.png

最近在写一些导入导出Excel的代码,涉及到反射相关的部分,发现自己民之前的知识体系有问题,整理一下。

bean 部分代码:

public class Study implements Serializable {private String name;public String getName() {    System.out.println("com.zhouxianglh.bean.Study.getName().....................");    return name;}public void setName(String name) {    this.name = name;}}

反射调用代码:

public static void main(String[] args) throws Exception {Study stu = new Study();stu.setName("abcd");//方式1Field field = stu.getClass().getDeclaredField("name");field.setAccessible(true);System.out.println("type1:" + field.get(stu));//方式2PropertyDescriptor propertyDescriptor = new PropertyDescriptor("name", stu.getClass());Method method = propertyDescriptor.getReadMethod();System.out.println("type1:" + method.invoke(stu));}

输出结果:

type1:abcdcom.zhouxianglh.bean.Study.getName().....................type1:abcd

 

上面的例子中通过两种方式获取Bean对象的值:

方式1 获取Field 字段,之后通过禁用安全检查 field.setAccessible(true); ,之后直接获取到对象的属性值,从输出结果来看并没有经过get方法。使用的方法是

Object sun.misc.Unsafe.getObject(Object paramObject, long paramLong)

public native Object getObject(Object paramObject, long paramLong);

很明显通过native方法直接获取属性值,所以并没有通过get方法

 

方式2 获取get方法 propertyDescriptor.getReadMethod(); ,之后通过反射调用get方法获取值

 

之前一直认为即使是反射,如果没有get方法,也不可以获取私有属性的值。这是一个误区。

上面两种获取值的方法比较一下,很明显第一种方式暴露了对象的实现,很糟糕的方式。如果有这个需要不如把对象属性设置为public,大家都知道bean为何要把属性设置为private,所以方式1糟糕的地方就很明显了

 

 

转载于:https://my.oschina.net/zhouxiang/blog/794875

你可能感兴趣的文章
TortoiseSVN中图标的含义
查看>>
VC中实现文字竖排的简单方法
查看>>
深入理解浏览器的缓存机制
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
dubbo源码分析-架构
查看>>
Windows phone 8 学习笔记
查看>>
我的友情链接
查看>>
LeetCode--112--路径总和
查看>>
感悟贴2016-05-13
查看>>
百度编辑器ueditor 光标位置的坐标
查看>>
DEV-C++ 调试方法简明图文教程(转)
查看>>
参加婚礼
查看>>
Java重写equals方法和hashCode方法
查看>>
Spark API编程动手实战-07-join操作深入实战
查看>>
EasyUI基础入门之Easyloader(载入器)
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
MySQL 备份与恢复
查看>>
TEST
查看>>
PAT A1037
查看>>
(六)Oracle学习笔记—— 约束
查看>>