標籤:object 的區別 源碼編譯 擷取 導致 rac ati 必須 student
為何要使用同步?
java允許多線程並發控制,當多個線程同時操作一個可共用的資源變數時(如資料的增刪改查), 將會導致資料不準確,相互之間產生衝突,因此加入同步鎖以避免在該線程沒有完成操作之前,被其他線程的調用, 從而保證了該變數的唯一性和準確性。
同步方法和同步代碼塊的區別
同步方法使用synchronize修飾方法,在調用該代碼塊時,需要獲得內建鎖(java對象都有一個內建鎖,否則就處於阻塞狀態)內建鎖會保護整個方法。在調用該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 2.同步代碼塊使用synchronized(object){}進行修飾,在調用該代碼塊時,需要獲得內建鎖,否則就處於阻塞狀態 代碼如: synchronized(object){ //內容 }
Java 反射機制
反射的概述Reflection JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。要想解剖一個類,必須先要擷取到該類的位元組碼檔案對象。而解剖使用的就是Class類中的方法.所以先要擷取到每一個位元組碼檔案對應的Class類型的對象. 1.位元組碼。所謂的位元組碼就是當java虛擬機器載入某個類的對象時,首先須要將硬碟中該類的源碼編譯成class檔案的二進位代碼(位元組碼),然後將class檔案的位元組碼載入到記憶體中,之後再建立該類的對象 2.java反射的基礎是Class類,Class類執行個體代表著內中中的一份位元組碼。 3.擷取反射的建構函式。有了主要的Class類,要擷取類的對象,首先要擷取類的建構函式,這裡主要使用的是Class類的getConstructor方法
反射例子
package fanshe;/** * 擷取Class對象的三種方式 * 1 Object ——> getClass(); * 2 任何資料類型(包括基礎資料型別 (Elementary Data Type))都有一個“靜態”的class屬性 * 3 通過Class類的靜態方法:forName(String className)(常用) * */public class Fanshe { public static void main(String[] args) { //第一種方式擷取Class對象 Student stu1 = new Student();//這一new 產生一個Student對象,一個Class對象。 Class stuClass = stu1.getClass();//擷取Class對象 System.out.println(stuClass.getName()); //第二種方式擷取Class對象 Class stuClass2 = Student.class; System.out.println(stuClass == stuClass2);//判斷第一種方式擷取的Class對象和第二種方式擷取的是否是同一個 //第三種方式擷取Class對象 (常用) try { Class stuClass3 = Class.forName("fanshe.Student");//注意此字串必須是真實路徑,就是帶包名的類路徑,包名.類名 System.out.println(stuClass3 == stuClass2);//判斷三種方式是否擷取的是同一個Class對象 } catch (ClassNotFoundException e) { e.printStackTrace(); } }}注意:在運行期間,只能有一個Class對象產生
Java 中 Reflection 和 Introspection 區別?
說起反射,還有一個相似的概念 ‘Introspection’,字面意思是“自省、內省”,它們之間的區別如下:內省 在運行時檢查一個對象的類型或者屬性 最常見的例子就是運行時通過 a instanceof A 來判斷 a 對象的類型反射 用來在運行時檢查或者修改一個對象資訊 可以用來實現看似不可能的操作,比如訪問私人方法,動態建立對象 可以看到,反射是在內省的基礎上,增加了修改的能力。
通過反射擷取構造方法並使用
package fanshe; public class Student { //---------------構造方法------------------- //(預設的構造方法) Student(String str){ System.out.println("(預設)的構造方法 s = " + str); } //無參構造方法 public Student(){ System.out.println("調用了公有、無參構造方法執行了。。。"); } //有一個參數的構造方法 public Student(char name){ System.out.println("姓名:" + name); } //有多個參數的構造方法 public Student(String name ,int age){ System.out.println("姓名:"+name+"年齡:"+ age);//這的執行效率有問題,以後解決。 } //受保護的構造方法 protected Student(boolean n){ System.out.println("受保護的構造方法 n = " + n); } //私人構造方法 private Student(int age){ System.out.println("私人的構造方法 年齡:"+ age); } }測試類別 package fanshe; import java.lang.reflect.Constructor;/* 通過Class對象可以擷取某個類中的:構造方法、成員變數、成員方法;並訪問成員; 1.擷取構造方法: 1).批量的方法: public Constructor[] getConstructors():所有"公有的"構造方法 public Constructor[] getDeclaredConstructors():擷取所有的構造方法(包括私人、受保護、預設、公有) 2).擷取單個的方法,並調用: public Constructor getConstructor(Class... parameterTypes):擷取單個的"公有的"構造方法: public Constructor getDeclaredConstructor(Class... parameterTypes):擷取"某個構造方法"可以是私人的,或受保護、預設、公有; Constructor-->newInstance(Object... initargs) */public class Constructors { public static void main(String[] args) throws Exception { //1.載入Class對象 Class clazz = Class.forName("fanshe.Student"); //2.擷取所有公有構造方法 System.out.println("**********************所有公有構造方法*********************************"); Constructor[] conArray = clazz.getConstructors(); for(Constructor c : conArray){ System.out.println(c); } System.out.println("************所有的構造方法(包括:私人、受保護、預設、公有)***************"); conArray = clazz.getDeclaredConstructors(); for(Constructor c : conArray){ System.out.println(c); } System.out.println("*****************擷取公有、無參的構造方法*******************************"); Constructor con = clazz.getConstructor(null); //1>、因為是無參的構造方法所以類型是一個null,不寫也可以:這裡需要的是一個參數的類型,切記是類型 //2>、返回的是描述這個無參建構函式的類對象。 System.out.println("con = " + con); //調用構造方法 Object obj = con.newInstance(); // System.out.println("obj = " + obj); // Student stu = (Student)obj; System.out.println("******************擷取私人構造方法,並調用*******************************"); con = clazz.getDeclaredConstructor(char.class); System.out.println(con); //調用構造方法 con.setAccessible(true);//暴力訪問(忽略掉存取修飾詞) obj = con.newInstance(‘男‘); } }
擷取反射的方法。
public static void main(String[] args) throws Exception { String s1 = "hello"; //參數為函數名,函數的參數(可變長) Method m = s1.getClass().getMethod("charAt", int.class); //參數為要調用的對象,以及函數的參數。這裡假設第一個參數為null,表示調用的是類的靜態方法 System.out.println(m.invoke(s1, 1)); }
2018.8.1 Java中的反射和同步詳解