成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

(CZ深入淺出Java基礎(chǔ))反射

asoren / 661人閱讀

摘要:分類根類加載器也被稱為引導(dǎo)類加載器,負(fù)責(zé)核心類的加載比如等。要想解剖一個(gè)類必須先要獲取到該類的字節(jié)碼文件對(duì)象。

這是劉意老師的JAVA基礎(chǔ)教程的筆記
講的賊好,附上傳送門

傳智風(fēng)清揚(yáng)-超全面的Java基礎(chǔ)

一、類的加載 1.類初始化的時(shí)機(jī)

創(chuàng)建類的實(shí)例
訪問類的靜態(tài)變量,或者為靜態(tài)變量賦值
調(diào)用類的靜態(tài)方法
使用反射方式來強(qiáng)制創(chuàng)建某個(gè)類或接口對(duì)應(yīng)的java.lang.Class對(duì)象
初始化某個(gè)類的子類
直接使用java.exe命令來運(yùn)行某個(gè)主類

2.類加載器

2.1.作用

負(fù)責(zé)將.class文件加載到內(nèi)在中,并為之生成對(duì)應(yīng)的Class對(duì)象。
雖然我們不需要關(guān)心類加載機(jī)制,但是了解這個(gè)機(jī)制我們就能更好的理解程序的運(yùn)行。

2.2.分類

Bootstrap ClassLoader 根類加載器
也被稱為引導(dǎo)類加載器,負(fù)責(zé)Java核心類的加載
比如System,String等。在JDK中JRE的lib目錄下rt.jar文件中

Extension ClassLoader 擴(kuò)展類加載器
負(fù)責(zé)JRE的擴(kuò)展目錄中jar包的加載。
在JDK中JRE的lib目錄下ext目錄

Sysetm ClassLoader 系統(tǒng)類加載器
負(fù)責(zé)在JVM啟動(dòng)時(shí)加載來自java命令的class文件,以及classpath環(huán)境變量所指定的jar包和類路徑

二、反射

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語言的反射機(jī)制。要想解剖一個(gè)類,必須先要獲取到該類的字節(jié)碼文件對(duì)象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個(gè)字節(jié)碼文件對(duì)應(yīng)的Class類型的對(duì)象.

class類包含:

  成員變量  Field

  構(gòu)造方法  Consturctor

  成員方法  Method

并且把這三個(gè)東西都看做對(duì)象

1.獲取class文件對(duì)象的三種方式
public class Demo {
    public static void main(String[] args) throws ClassNotFoundException {
        //方式1
        Person p=new Person();
        Class c=p.getClass();
        
        Person p2=new Person();
        Class c2=p.getClass();
        
        System.out.println(p==p2);
        System.out.println(c==c2);
        
        //方式2
        Class c3=Person.class;
        
        //方式3
        Class c4=Class.forName("demo1.Person");//要全路徑
    }
}
2.通過反射獲取無參構(gòu)造方法并使用
package demo1;

import java.lang.reflect.Constructor;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路徑

        // 獲取構(gòu)造方法
        System.out.println("獲取public構(gòu)造方法");
        Constructor[] cons = c.getConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }

        System.out.println("獲取所有構(gòu)造方法");
        cons = c.getDeclaredConstructors();
        for (Constructor constructor : cons) {
            System.out.println(constructor);
        }

        System.out.println("運(yùn)用class字節(jié)碼文件獲取某個(gè)構(gòu)造方法對(duì)象,并創(chuàng)建該類的實(shí)例");
        Constructor con = c.getConstructor();
        Object obj=con.newInstance();
        System.out.println(con);
    }
}

class Person {
    // 成員變量
    private String name;
    int age;
    public String address;

    // 構(gòu)造方法
    public Person() {
    }
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成員方法
    public void show() {
        System.out.println("show");
    }
    public void method(String s) {
        System.out.println("method" + s);
    }
    public String getString(String s, int i) {
        return s + "---" + i;
    }
    private void function() {
        System.out.println("function");
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}
3.通過反射去獲得含參構(gòu)造方法
package demo1;

import java.lang.reflect.Constructor;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路徑

        System.out.println("運(yùn)用class字節(jié)碼文件獲取某個(gè)構(gòu)造方法對(duì)象,并創(chuàng)建該類的實(shí)例");
        Constructor con = c.getConstructor(String.class, int.class, String.class);
        Object obj = con.newInstance("zxy",23,"Xi"an");
        System.out.println(obj);
    }
}

class Person {
    // 成員變量
    private String name;
    int age;
    public String address;

    // 構(gòu)造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成員方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}
4.獲取私有構(gòu)造方法
package demo1;

import java.lang.reflect.Constructor;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路徑

        System.out.println("運(yùn)用class字節(jié)碼文件獲取某個(gè)構(gòu)造方法對(duì)象,并創(chuàng)建該類的實(shí)例");
        Constructor con = c.getDeclaredConstructor(String.class);
        con.setAccessible(true);//取消Java語言的訪問檢查
        Object obj = con.newInstance("zxy");
        System.out.println(obj);
    }
}

class Person {
    // 成員變量
    private String name;
    int age;
    public String address;

    // 構(gòu)造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成員方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}
5.通過反射調(diào)用方法
package demo1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路徑
        Constructor con = c.getConstructor();
        Object obj = con.newInstance();

        Method m1 = c.getMethod("show");//獲取方法對(duì)象
        m1.invoke(obj);//調(diào)用哪個(gè)對(duì)象的這個(gè)方法

        Method m2 = c.getMethod("method", String.class);
        m2.invoke(obj, "123");

        Method m3 = c.getDeclaredMethod("function");
        m3.setAccessible(true);
        m3.invoke(obj);
    }
}

class Person {
    // 成員變量
    private String name;
    int age;
    public String address;

    // 構(gòu)造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成員方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}
6.通過反射調(diào)用成員變量
package demo1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class Demo {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("demo1.Person");// 要全路徑
        Constructor con=c.getConstructor();
        Object obj=con.newInstance();
        Field addressField = c.getField("address");
        addressField.set(obj, "xian");
        System.out.println(obj);
    }
}

class Person {
    // 成員變量
    private String name;
    int age;
    public String address;

    // 構(gòu)造方法
    public Person() {
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private Person(String name) {
        this.name = name;
    }

    public Person(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 成員方法
    public void show() {
        System.out.println("show");
    }

    public void method(String s) {
        System.out.println("method" + s);
    }

    public String getString(String s, int i) {
        return s + "---" + i;
    }

    private void function() {
        System.out.println("function");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}
7.通過用戶的增刪改查和學(xué)生登錄注冊(cè)引入中介 三、動(dòng)態(tài)代理

代理:本來應(yīng)該自己做的事情,卻請(qǐng)了別人來做,被請(qǐng)的人就是代理對(duì)象。
舉例:春季回家買票讓人代買
動(dòng)態(tài)代理:在程序運(yùn)行過程中產(chǎn)生的這個(gè)對(duì)象
而程序運(yùn)行過程中產(chǎn)生對(duì)象其實(shí)就是我們剛才反射講解的內(nèi)容,所以,動(dòng)態(tài)代理其實(shí)就是通過反射來生成一個(gè)代理

(我也沒太聽懂)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67509.html

相關(guān)文章

  • Java9模塊化學(xué)習(xí)筆記二之模塊設(shè)計(jì)模式

    摘要:但是模塊化當(dāng)中,無法掃描只有模塊中可以使用有兩種解決方案定義一個(gè)專門的資源模塊,并使用提供的接口,實(shí)現(xiàn)它,并將這個(gè)實(shí)現(xiàn)注冊(cè)為服務(wù)。有兩種方式使用或包名,包名模塊名使用運(yùn)行時(shí)動(dòng)態(tài)。 模塊設(shè)計(jì)的原則: 1、防止出現(xiàn)編譯時(shí)循環(huán)依賴(主要是編譯器不支持),但運(yùn)行時(shí)是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計(jì): API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...

    李文鵬 評(píng)論0 收藏0
  • CZ深入淺出Java基礎(chǔ))設(shè)計(jì)模式筆記

    摘要:在設(shè)計(jì)模式中,所有的設(shè)計(jì)模式都遵循這一原則。其實(shí)就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計(jì)模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚(yáng)-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計(jì)原則 1.單一職責(zé)原則 其實(shí)就是開發(fā)人員經(jīng)常說的高...

    李昌杰 評(píng)論0 收藏0
  • CZ深入淺出Java基礎(chǔ))線程筆記

    摘要:一個(gè)進(jìn)程如果有多條執(zhí)行路徑,則稱為多線程程序。這可能拋出在當(dāng)前線程中。考慮多線程的數(shù)據(jù)安全問題是否是多線程環(huán)境。當(dāng)前線程必須擁有此對(duì)象監(jiān)視器。此方法導(dǎo)致當(dāng)前線程稱之為將其自身放置在對(duì)象的等待集中,然后放棄此對(duì)象上的所有同步要求。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚(yáng)-超全面的Java基礎(chǔ) 一、線程的引入 1.多線程概述 進(jìn)程 a.正在運(yùn)行的程序,是...

    harryhappy 評(píng)論0 收藏0
  • Java相關(guān)

    摘要:本文是作者自己對(duì)中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對(duì)之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時(shí)搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個(gè)接口,程序可以通過...

    wangtdgoodluck 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<