#java
前文开发项目时候,有个老项目的static方法块,需要读取配置中心的项目信息来实例化项目的某个对象。
期初大家可能会利用如下方法
@Component
public class StaticTest {
private static Object o;
@Value("${test.url}")
private static String url;
static {
o =creatOb(url);
}
static Object creatOb(String url){
return null;
}
但是实际在使用URL的时候还是null。
经过排查发现:
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在创建对象的时候,即new 操作的时候才初始化的;
先后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员还没有被加载必然不能使用,而非static的成员是在类加载之后,通过new操作符创建对象的时候初始化,此时static 已经分配内存空间,所以可以访问!
简单点说:静态成员属于类,不需要生成对象就存在了.而非静态需要生成对象才产生.所以静态成员不能直接访问非静态.
所以要解决上面的问题,就得改变静态方法执行的节点,改为使用如下注解就可以
@PostConstruct
public static void setO() {
o =creatOb(url);
或者使用@value在
@Value("${test.url}")
public
static void setO(String url) {