最近在做需求时,看到别人的代码里写了一个缓存机制,缓存使用了一个ConcurrentMap 存放了数据库的key和value数据
即一个配置表的数据,同时记下Long.valueOf(System.currentTimeMillis())当前时间。缓存10分钟
这里在junit测试需求中一个开关时,发现 在查询出开关后,发现缓存里总是存第一次的 开关值,故需要重置缓存。
于是就用了如下方法解决:
Class senClass =Class.forName("com.paic.cfs.common.shield.SensitiveShieldUtil");
Field field =senClass.getDeclaredField("cache");
field.setAccessible(true);
field.set("cache",newHashMapCacheStrategy());
FROM
https://blog.csdn.net/sinat_38259539/article/details/71799078
API 中 Class 类:
Class 类的实例表示正在运行的 java应用程序中的类和接口,也就是JVM中有N多的实例每个实例都有class 对象,(包括基本数据类型)
Class 没有公共方法,Class对象是在加载类时由虚拟机以及通过调用类加载器中的defineClass方法自动构造的。
3种方法获取类对象:
public static void main(String[] args)
{
//1.Object----> getClass()方法
Student stu1 = new Student();
System.out.println(stu1.getClass().getName());
//2.任何数据类型(包括基本数据类型)都有一个静态的class属性
System.out.println(Student.class == stu1.getClass());
//3.通过Class 类获取对应的student的class对象,这里必须使用全限定路径,因为java虚拟机的类加载器根据全限定名来装入类型(类或接口)
try { System.out.println(Class.forName("com.paic.cfs.customerServiceGuide.service.Student"));
} catch(ClassNotFoundException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
在以上需求中主要用到了getDeclaredField()的方法,一开始使用的是getField()方法,发现抛异常。
getDeclaredField()和getField()的区别:
getDeclaredField可以获取一个类的所有字段,
getField获取的是类的public字段。
详见:https://www.cnblogs.com/ldq2016/p/5368840.html