反射中getcalss()与 A.calss区别?

假设

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这个类的定义。