Java23

Java23

關於反射—reflect:

耦合度:多個模塊之間的關聯或者依賴關係;

而反射就可以降低模塊之間的耦合度;

反射用於解析類,解析找到字節碼對象以產生實例對象的過程;

字節碼對象—也就是 class對象

反射的缺點:—(也是反射的強大之處)

1、打破封裝原則;

2、跳過泛型的類型檢測;

Class-----代表類的類------代表字節碼文件的類;

Field-----代表屬性的類;

Method ---- 代表方法的類;

Construct----代表構造方法的類

Annoctatoion—代表包的類

Package–代表包的類,

獲取字節碼對象的方式:

第一種

獲取字節碼對象

public static void main(String[] args){

// 通過類名.class;

//獲取String的字節碼對象;
Class<String> str  =String.class;

System.out.println(str);

//獲取List接口的字節碼對象;
Class<List> ls = List.class;

System.out.println(ls);
//獲取基本類型的字節碼對象
Class in = int.class;


}

第二種方式

public static void main(String[] args){


//對象.getClass;


String str = "abc";

Class<String> st = (Class<String>)str.getClass;

System.out.println(st);


Integer in = 12;

Class<Integer> in1=(Class<Integer>)in.Class();

System.out.println(in1);


}

第三種方法

public static void main(String[] args){



//類和對象都獲取不到的時候

//Class.forName(字符串形式的全路徑名稱);--即可獲取對應的字節碼對象;

Class cl =  Class.forName("java.util.Date");


System.out.println(cl);



}







public static void main(String[] args){

//先獲取String的字節碼對象

Class<String>= str = String.class;

//獲取實例對象

//newInstance()----就是默認在調用類的無參構造;

String st = str.newInstance();



//通過字節碼對象調用String類的有參構造

Construction c =  str.getConstruction(char[].class);//傳入構造方法的參數類型的字節碼對象;

// 獲取到的有參構造,調用Instance,傳入實際參數,創建實例對象;

String  s = (String)c.newInstance(new char[]{'1','2','3'});


System..out.println(s);

//獲取構造方法

Constructor c1 = str.getConstructor(String.class);

String s1 = (String) c1.newInstance("asd");


System.out.println(s1);


通過Integer的全路徑名獲取Integer的實例對象並賦值

Class<Integer>in1 = (Class<Integer>);

  Class.forName("java.lang.Integer");


Integer inn = (Integer)in1.newInstance(12);

System.out.println(inn);


}

public static void main(String[] args){


Class<String> clz = String.class;

//獲取默認構造方法的方式

clz.getDeclaredConstructor(char[].class,boolean.class);


//暴力破解--可以操作特殊的構造方法;
c.setAccessible(true);

//傳參
String str = (String)c.newInstance(new char[]{'1'},true);

System.out.println(str);


//獲取類中的所有構造方法;

/*Constructor[] sc =clz.getDeclaredCinstructors();

for(Constructor Constructor:cs){

System.out.println(Constructor);*/
}

}


public static void main(String args[]){


//String字節碼對象
//獲取

Class<Sting> clz = String.class;

//獲取指定的屬性--hash

Field f = clz.getDeclaredField("hash");


//暴力破解

f.setAccessible(true);

//字符串對象----屬性;

String str = "asd";

//給對象的屬性賦值---給Str對象的hash屬性賦值爲456;

f.set(srt,456);

//取值--獲取str隊形hash屬性的值;

System.println(f.get(str));


}


public static void main(String[] args){

Class<String> clz = String.class;


Method m = clz.getDeclaredMetod("charAt",int.class);


String s = "adad";

//通過 .invoke調用方法;

char c = (char)m.invoke(s,3);

System.out.println(c);

}

關於註解

可以自定義註解,如下:

@interface First{
//默認被public static final修飾	
	int i=10;
//聲明屬性	,不賦值的方式
	double d();
//	支持的屬性類型--基本數據類型,String,class
//	annotation、enum、一維數組
}


關於元註解---用於控制、限制註解的使用情況;

@Target---控制註解可以在什麼位置使用

@Ratation

關於單例設計模式

簡單舉例三個

直接生產本類對象

class TaskManager{
	
//	構造方法私有化
//	飢餓式實現方式
private TaskManager	(){
	
}
//創建對象
private   static final  TaskManager	tm = new TaskManager();
//給外界獲取的方法
public static TaskManager  getInstance(){
	
//	把唯一 一個對象進行返回;
	return tm;
}



}

需要調用對象時才生成對應的對象,但是會存在多線程併發安全的問題;

class TaskManager{
	
//	構造方法私有化
//	懶漢式實現方式
private TaskManager	(){
	
}
//創建對象
private   static  TaskManager	tm = null;
//給外界獲取的方法
public static TaskManager  getInstance(){
	
//判斷對象是否爲null;
	if(tm==null){
		tm = new TaskManager();
		
	}
	return tm;
}

}

//枚舉實現方式,優點是可以防止反射破壞

enum TaskManager{

tm;

}

關於JVM參數

棧:用於計算的 是被線程單獨使用

堆:存儲的是對象 是被所有線程共享的

方法區:原名永久代 方法區挪到堆裏 存儲的是類的所有信息 被
所有線程共享

本地方法棧:用於計算的本地方法 被線程單獨使用

PC計數器:用於存儲計算機/程序的指令以及調度 被線程單獨使用
-X 參數—標準參數
-Xxxx 參數—非標準參數
-XXxxx 參數—擴展參數
-Xss128K—指定的是棧內存的大小
-Xmx—對的最大內存大小
-XX:+PrintGCDetails—指明GC的執行的詳細細節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章