一、java類初始化
- 初始化操作:按照源代碼從上到下的順序依次執(zhí)行靜態(tài)代碼塊和初始化靜態(tài)域。在一個(gè)類被初始化前悴能,其父類也需要被初始化揣钦。
- 初始化的時(shí)機(jī):
(1)創(chuàng)建類的實(shí)例,比如new創(chuàng)建對(duì)象漠酿。
(2)訪問(wèn)某個(gè)類或接口的靜態(tài)變量冯凹,或者對(duì)該靜態(tài)變量復(fù)制。
(3)調(diào)用類的靜態(tài)方法炒嘲。
(4)反射宇姚。 - 如果訪問(wèn)一個(gè)類的用final修飾靜態(tài)變量,這個(gè)變量在編譯時(shí)就能確定夫凸,不會(huì)導(dǎo)致初始化浑劳。
package cn.wxz1997.concurrency.annotation;
/**
* @Description: ${todo}
* @Author: wxz1997
* @Date 18-6-19下午2:22
*/
public class StaticDemo {
public static void main(String[] args) {
System.out.println(TestStatic.a);
}
}
class TestStatic{
public static final String a = "wxz1997";
static {
System.out.println("初始化");
}
}
//加了final輸出wxz1997
//去掉final輸出初始化wxz1997
二、java反射機(jī)制
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中夭拌,對(duì)于任意一個(gè)類魔熏,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象鸽扁,都能夠調(diào)用它的任意一個(gè)方法和屬性蒜绽;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射。
獲得類類型的三種方法:
(1)Class cls = Test.class;
(2)Class cls = Class.forName("cn.wxz1997.concurrency.reflection.Test");
(3)Class cls = test.getClass();
以上獲得cls為同一類對(duì)象創(chuàng)建對(duì)象
(1)Class對(duì)象的newInstance,比較常用的方法桶现,缺點(diǎn)只能調(diào)用默認(rèn)的構(gòu)造方法躲雅。
(2)Class對(duì)象getConstructor獲得Constructor調(diào)用newInstance。反射的應(yīng)用
package cn.wxz1997.concurrency.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @Description: ${todo}
* @Author: wxz1997
* @Date 18-6-19下午2:42
*/
public class Test {
int a = 9;
private static String b = "wxz1997";
public Test() {
}
public Test(int a) {
this.a = a;
}
public void test(){
System.out.println("hello");
}
public String test2(int a, String b){
return "hello" + a + b;
}
}
class TestReflection{
public static void main(String[] args) {
try {
Class cls = Class.forName("cn.wxz1997.concurrency.reflection.Test");
System.out.println(cls);
//獲取構(gòu)造方法
Constructor[] constructors = cls.getDeclaredConstructors();
for (Constructor constructor:constructors){
System.out.println(constructor);
}
//獲取方法
Method[] methods = cls.getDeclaredMethods();
for (Method method:methods){
System.out.println(method);
}
//獲取參數(shù)
Field[] fields = cls.getDeclaredFields();
for (Field field: fields){
System.out.println(field);
}
//newInstance創(chuàng)建對(duì)象
Object obj = cls.newInstance();
/**
* 反射調(diào)用對(duì)象的方法
*/
Method method = cls.getMethod("test2", int.class, String.class);
String value = (String) method.invoke(obj, 1, "wxz1997");
System.out.println(value);
/**
* 反射獲取對(duì)象屬性的值
*/
Field field = cls.getDeclaredField("a");
int a = (int) field.get(obj);
System.out.println(a);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//執(zhí)行結(jié)果如下:
//class cn.wxz1997.concurrency.reflection.Test
//public cn.wxz1997.concurrency.reflection.Test(int)
//public cn.wxz1997.concurrency.reflection.Test()
//public java.lang.String cn.wxz1997.concurrency.reflection.Test.test2(int,java.lang.String)
//public void cn.wxz1997.concurrency.reflection.Test.test()
//int cn.wxz1997.concurrency.reflection.Test.a
//private static java.lang.String cn.wxz1997.concurrency.reflection.Test.b
//hello1wxz1997
//9