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的執行的詳細細節