Spring3.x__反射机制

1.通过反射机制创建对象过程

cagegory类:

public class cagegory {
  private Integer id;
  private String name;

  //自行脑补set get 方法.
}

cagegory对象的创建:

 

  //获取当前进程的类加载器
  ClassLoader loader = Thread.currentThread().getContextClassLoader();
  Class clazz = loader.loadClass("jzx.bean.cagegory");

  //获取类的默认构造器对象并调用 构造该对象
  Constructor cons = clazz.getDeclaredConstructor(null);
  cagegory cage = (cagegory)cons.newInstance();

  Method setName = clazz.getMethod("setName", String.class);
  setName.invoke(cage, "盖伦");
  Method setId = clazz.getMethod("setId", Integer.class);
  setId.invoke(cage, 3);

  //获取 类的成员变量类

  Field id = clazz.getDeclaredField("id");

  //当成员变量是 private时,使用setAccessible方法略过JVM安全检查。
  id.setAccessible(true);
  id.set(cage, 7);


  System.out.println(cage.toString());

 

额外解读:

每次运行JVM时,都会产生三个加载器:分别是 根加载器(ClassLoader),扩展类加载器(ExtClassLoader) 和  系统类加载器(AppClassLoader)。

默认使用的是 系统类加载器,它是扩展类加载器的子类,扩展类加载器又是 根加载器的子类,但是根加载器是c++编写的,在java中访问不能。

 

 2020/4/16日补充:

昨天的笔记还是太过于粗糙了,简单补充一点:  Class类的 getMethods 和 getDeclaredMethods的区别。

getMethods: 只能获取某个类及他父类的 public方法。

getDeclaredMethods : 只能获取某个类声明的方法(继承的不算,接口实现也包括声明了所以是算的),且包括 public private protected.

 

另外如果要获取多个参数的方法,或获取无参数的方法时:

多参数: getDeclaredMethod(String name, int.Class, String.class, double.class)  

无参数:    getDeclaredMethod(String name

 

posted @ 2020-04-15 18:28  赤鱿  阅读(113)  评论(0)    收藏  举报