反射

反射:

  在运行状态中,通过类的Class,调用它的任意方法和属性。

Class获取方式:

  1. 通过字面量直接获取,如Class clazz = Person.class  , 未完成初始化
  2. 通过Object类的getClass方法,如Class clazz = Person.getClass(),已完成初始化
  3. 通过Class的静态方法forName(), 如Class clazz = Class.forName("com.orbc.Person"),已完成初始化

调用:Field、Constructor、Method等

Class clazz = Person.class;     

// 获取 Constructor (无参构造)
Constructor constructor = clazz.getDeclaredConstructor(); 
// 获取 Field 
Field field = clazz.getDeclaredField("属性名称");
// 获取 Method (无参方法) 
Method method = clazz.getDeclaredMethod("方法名称"); 

// 获取值
Person target = (Person)constructor.newInstance();
Object object = field.get(target);
Object returnObject = method.invoke(target);机制

机制(使用了CAS):

  获取 Field、Constructor、Method等,

    缓存中不存在或者被垃圾回收:创建新的并放到缓存中

    缓存中存在:从缓存中获取

    缓存使用:SoftReference 软引用,如果内存满了,将软引用垃圾回收

 

posted @ 2020-07-13 15:56  orbc  阅读(93)  评论(0)    收藏  举报