假设
A a = new A();
a.val = 1;
A.calss 与 a.getClass 能取到 a.val 的值吗?
首先说结论,`A.class`、`a.getClass()`、`Class.forName("A")` 这三种方式没有区别,只是使用场景不同。
在同一个JVM里某一个类的 `Class` 对象是唯一的而且是无状态的,也就是楼上说的类模板。
啥意思呢,比如 `A` 这个类, `A.class` 和 `Class.forName("A")` 和 `a1.getClass()` 、`a2.getClass()`... 这三种方式获取到的 `Class` 对象全部是同一个。
并且这个对象中只有元数据没有任何业务数据,可以说你写这个类的.java文件时这个类的 `Class` 对象中有什么就已经确定了,包括有哪些field、method,这些成员又是怎么组成的等描述 `A` 本身的信息。
想要获取 `A` 的某个对象的属性值 `val` 就必须提供一个真实对象`a`,`Class` 对象提供类 `A` 的基本信息,真实对象`a`提供属性 `val` 的具体值,如此你才能获取到 `a.val`
确实可以,通过实例 getclass 后可以指定 field 并取得具体的值,A.class 就不行,就像通过类只能读到static成员一样,读不到实例的值
不能获取a.val
A.class和a.getClass一样都是获取class对象,class对象可以用来创建实例
无论你是怎么获取的,都是获取的同一个类对象。实践出真理^-^
import java.lang.reflect.Field;
class Person{
static int id;
static String name;
int t;
final int p =90;
}
public class Main {
public static void main(String[] args) throws IllegalAccessException {
Person p = new Person();
Person .id=2;
p.t=33;
Person.name = "梨花";
Class clazz = p.getClass();
Field[] fields = clazz.getDeclaredFields();
for(Field field: fields){
String name = field.getName();
field.setAccessible(true);
Object resultValue;
try {
resultValue = field.get("");
}catch (Exception e){
System.out.println(e);
resultValue="异常无法获取";
}
System.out.println("获取属性值时没有传实例化对象");
System.out.println(name + ": " + resultValue);
System.out.println("获取属性值时传实例化对象");
Object resultValue2 = field.get(p);
System.out.println(name + ": " + resultValue2);
System.out.println("________________");
}
}
}
结果:
获取属性值时没有传实例化对象
id: 2
获取属性值时传实例化对象
id: 2
________________
获取属性值时没有传实例化对象
name: 梨花
获取属性值时传实例化对象
name: 梨花
________________
java.lang.IllegalArgumentException: Can not set int field Person.t to java.lang.String
获取属性值时没有传实例化对象
t: 异常无法获取
获取属性值时传实例化对象
t: 33
________________
java.lang.IllegalArgumentException: Can not set final int field Person.p to java.lang.String
获取属性值时没有传实例化对象
p: 异常无法获取
获取属性值时传实例化对象
p: 90
________________
Process finished with exit code 0
通过反射在获取属性值时没有传递实例化对象只能获取static 的值。至于Person.clsaa和p.class是没有区别返回的都是同一个class。不明白的话建议看一下Class这个类的定义。