通过Java反射机制获取对象实例属性值

在java的世界中,java有类这一个概念,java对象是java类的一个实例,这里就不画uml图了,这都是很简单的概念。

那么问题来了,类的是谁的对象实例呢?从其他的语言上,我们或多或少回听说,一切皆是组件啊,一切皆是对象之类的话,java也是以面向对象为核心理论的语言,那么类作为对象的抽象化,我们可以大胆的想象下,类又是谁的实例化呢?大家先不要反驳我,我们就类比推理下。其实,在java的世界里,还真是有这么一个概念,只是从理论上讲,我们的理解是抽象的。那就是反射里的Class类,是的,所有的类类型,都是Class类对象,这是不是很绕呢?

我们举例子说明下,首先,我定义一个自定义类A

class A {
	public int a;
	public int b;
	...
}

这个类,我们用反射的概念应该如何去实例花它呢?

Class clz = Class.forname(A.class.getName());
A a = clz.newInstance();

Class类的类方法forname可以用来装载和连接类,然后通过newInstance方法进行类的实例化操作。上面代码中的A.class获取到的就是A这个对象的类类型,也可以理解为,A是A.class的实例化。

通过上面的代码,我们下一步可以获取到A这个类里的属性和方法,甚至调用方法。那么我们如何能够获取到a对象的属性值呢?可以通过反射来获取吗?答案是必然的

Field field = clz.getfield("属性名");
Class<?> value = field.get(a);

这里要注意一点,getField()和getDeclareField()方法,前者获取的所有的属性值,除了私有的外,父类的方法的属性也能够获取到。而后者的方法,只能获取到当前类的属性方法,除了私有的属性外。

那么我们应该如何访问私有的属性呢?

field.setAccessible(true);

注意:setAccessible这个API可以对类中的私有属性设置为可访问的权限。 但是要结合
getDeclaredFiled和getDeclaredFields两个方法使用才会生效的。

好了,文章的结尾,也是我出这篇文章的重点,getDeclareField方法并不是获取所有的属性的方法,不要被网络上的文章误导了哈!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值