在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方法并不是获取所有的属性的方法,不要被网络上的文章误导了哈!