2018.8.1 Java中的反射和同步詳解

來源:互聯網
上載者:User

標籤: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中的反射和同步詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.