Class c = Cat.class;
  Field[] fields = c.getDeclaredFields();
  for (Field field : fields){
  System.out.println(field);
  }
  结果如下:
  public static int Cat.count
  public int Cat.age
  private java.lang.String Cat.name
  可以看到我们轻而易举的得到了Cat类的字段信息,再来:
  Method[] methods = c.getDeclaredMethods();
  for (Method method : methods){
  System.out.println(method);
  }
  结果如下 :
  public void Cat.run()
  private void Cat.ruff()
  好玩吧,我们竟然可以在运行时得到类的信息。同时我们发现Cat类中的静态初始化代码段并没有执行。接下来我们通过Class对象来获得对应的实例对象:
  try {
  Cat cat = (Cat) c.newInstance();
  } catch (InstantiationException e) {
  e.printStackTrace();
  } catch (IllegalAccessException e) {
  e.printStackTrace();
  }
  这时候静态代码块执行了:
  this is class Cat!
  接下来我们做一件神奇的事情:
  try {
  Class catClass = Class.forName("Cat");
  Field name = catClass.getDeclaredField("name");
  name.setAccessible(true);
  Cat cat2 = (Cat) catClass.newInstance();
  name.set(cat2,"Aristark");
  System.out.println(cat2.getName());
  } catch (ClassNotFoundException e) {
  e.printStackTrace();
  } catch (IllegalAccessException e) {
  e.printStackTrace();
  } catch (InstantiationException e) {
  e.printStackTrace();
  } catch (NoSuchFieldException e) {
  e.printStackTrace();
  }
  这次我们使用Class.forname()来获取Class对象,它的作用是让jvm查找并加载指定的类,也是说Cat类的静态代码块会被执行。其次值得注意的是,我们通过Class的几个方法访问了原本不可以被访问的name属性:
  this is class Cat!
  Aristark
  从这个意义上来说,反射机制并不符合OOP的思想,所以我们仅在必要的时候使用这个特性行了。
  四、后记
  理解好Class对象不仅能让我们更好的认识一切皆对象这个观点,对之后学习泛型,类型擦除都是很有帮助的,而对于java反射机制我们只需在适当的场合利用它即可。:)关于这两个知识的深入学习稍后我会贴出一些有借鉴意义的文章,大家要关注哦~