RestTemplate의 코드를 보던 중 아래와 같은 문법을 발견했다.
static {
ClassLoader classLoader = RestTemplate.class.getClassLoader();
romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader);
jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader);
gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
kotlinSerializationJsonPresent = ClassUtils.isPresent("kotlinx.serialization.json.Json", classLoader);
}
코틀린의 companion object와 비슷하게 동작할 것처럼 보여서 찾아봤다.
//kotlin의 companion object 예시
class MyClass {
companion object {
init {
println("Inside Kotlin companion object init block")
}
fun someFunction() {
println("Inside Kotlin companion object function")
}
}
}
그러나 실제 작동방식은 다르다고 한다. kotlin의 companion object는 말그대로 객체이며 이는static class로 컴파일된다. 그러나 java의 static 블록은 바로 바이트코드로 변환된다고 한다.
//static 블록이 변환된 바이트코드 예시
static {};
Code:
0: ldc #2 // String Inside Java static block
2: invokestatic #3 // Method java/lang/System.out.println:(Ljava/lang/String;)V
5: return