首頁>Club>
第一次學習,很迷糊,不知道有什麼用。
2
回覆列表
  • 1 # 看客觀點

    我舉一個例項:曾經給銀行幹外包的時候,有一個網貸使用者的校驗規則,規則很多,一條一條的,比如:該使用者徵信得分;該使用者在本行存款金額等等。有些規則可能銀行目前來用,以後可能會暫停使用,每一條規則都是一個處理類,但規則是否使用只能體現在資料庫中(銀行要求在頁面上配置規則是否使用),這怎麼辦呢?這時候就可以用到了java的反射。透過在庫裡查詢狀態為“使用”的規則編號,來建立處理類物件。規則編號只是一個類的名稱(一個字串,當然類名也是用規則編號命名的),並不是一個物件,所以用java的反射,用“規則編號”這個字串資訊,來建立類名為指定規則編號的物件。

    反射說白了,就是可以透過類名資訊(一個變數,有時候需要這個類 有時候需要其他類的時候),而不透過手動new的時候使用的方法。

  • 2 # 網路老鼠Sunny

    反射就是在執行期獲取型別資訊,Java反射更進一步,還允許修改一些資訊。至於如何實現的,是在編譯期間將相關資訊(型別元資料)放在class檔案中,在執行時候可以將這些資訊封裝成特定Java物件供系統使用。其實C++和Delphi等語言都可以提供(但程度稍低)RTTI資訊供執行時使用,但是以函式形式提供。

    因為編譯器在編譯期知道所有的型別細節資訊,所以,只要需要,任何語言都可以提供反射功能。

  • 3 # Java架構師日記

    一個類有:成員變數、方法、構造方法、包等等資訊,利用反射技術可以對一個類進行解剖,把個個組成部分對映成一個個物件。

  • 4 # 每日熱點速讀

    先說下反射機制的概念:在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

      那麼我們再來說下反射機制實現需要用到的類,總共有四大類:Class,Constructor,Method,Field。

      其實實現反射需要如下幾個步驟:

      1.獲取Class類

      2.透過Class建立物件

      3.獲取類中的方法

      4.獲取類中的屬性,屬性值或型別

      首先來說一下獲取Class的三種方法

    接下來透過Instance方法例項化物件

    最後就是透過建立Field物件和Method物件來獲取屬性和方法(這裡如果想要實現動態輸入必須要使set方法的setAccessible方法為true)

    上面介紹的是獲取單一屬性方法的辦法,

    也可以獲取整個類的所有屬性和方法如下程式碼所示:

    這就是使用反射機制的具體步驟。

    最後總結如下:

    我們透過整體程式碼可以知道,我們是可以透過使用者的輸入來調取某個類的某個方法或屬性,或是獲取某個類的所有方法或屬性,這也就對應瞭解到了開頭我們所說的反射的概念:動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制

  • 5 # 此生唯一

    JAVA中的反射無處不在,不僅在jdk中存在,還在諸如spring,mybatis,設計模式等中廣泛使用!

    首先要知道的是,JAVA可以算做編譯型語言,大多數的類,方法都在編譯時已經明確,這顯然不能滿足於我們所有的需求,使用反射就可以在執行時動態載入,透過類可以構造物件,準確的知道它的屬性,方法等全部資訊!

    JAVA中的反射方式有以下幾種:

    ①Class.forName(“類全路徑”);

    ②物件名.getClass

    反射的作用有:

    1,可以在執行時動態獲得物件,

    2,在執行時動態獲取一個類的構造器,方法,變數,註解等!

    3,實現動態代理。

    反射的缺點:因為是在執行時獲取,沒有JAVA的預編譯,在執行時效能存在問題!

    反射的實際使用場景:

    1,spring中例項化物件的時候如果都用new來建立物件,那將會十分繁瑣,而且加入新型別的時候也需要重新new,spring的做法是讓這些所有物件繼承自beanDefinition,這樣在例項化的時候,只要傳入父類和子類型別即可!

    2,動態代理:spring aop中的註釋模式就是用了動態代理,比如JdkDynamicAopProxy

  • 6 # 小創程式設計

    利用反射獲取方法、呼叫方法什麼的,這些我就不說了,隨便一本書都有介紹,我相信 99% 的人都能理解它的用法。儘管每本書都在強調反射很有用,但它就不說有什麼用,在這裡我表達一下我的理解。

    反射的概念

    首先看一下 Oracle 官方對反射的解釋:

    Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.

    意思就是,反射使 Java 程式碼能夠發現有關已載入類的欄位、方法和建構函式,並能透過相應的方法操作它們。它賦予了 Java 程式碼在執行時建立和修改物件的能力,而無需重新編譯,使應用程式執行本來不可能的操作。

    反射的用途

    反射常用於類庫或框架的編寫。顯然,它們在編譯時無法知道應用程式的結構,而有了反射,它們就可以針對已知介面程式設計,既解耦,又更具有動態性,因為反射可以動態例項化類並將其賦予它的某個介面。

    典型的,比如 Web 容器,它不知道你的應用程式,哪些類實現了 Servlet,哪些類實現了 Filter,但它可以透過 web.xml 配置的 servlet-class 或 filter-class 使用反射進行例項化,然後再執行你實現 Servlet 介面的類。

    整體來講,反射的使用場景可分為 3 類:

    例項化任意的類 - 比如,在依賴注入(Dependency Injection)的框架中,它憑藉類的全限定類名,使用反射找到類的建構函式並例項化

    動態代理 - 包裝一個類,典型的是在一個類方法呼叫前或呼叫後插入一些邏輯

    Marshalling/UnMarshalling - 類似序列化,比如透過 getter 或 setter 方法,將 JSON 或 XML 對映到一個物件時,程式碼不必知道欄位或方法的名稱,它只需檢查類的資訊

    反射的缺點

    雖然平時用的不多,但我們無不享受著它帶來的好處。當然了,它也有缺點,不能隨意使用,能免則免,缺點主要有:

    效能開銷 - 由於是動態解析型別,因此無法執行某些 JVM 最佳化,所以反射操作的效能稍慢,要避免頻繁訪問反射操作

    安全限制 - 反射需要在一個沒有安全限制的環境中執行,如果程式必須在有安全限制的上下文中執行(如 Applet),這就是個問題了

  • 7 # 邊緣人

    1、什麼是反射?

    Java反射就是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態(或準動態,為啥要說是準動態,因為一般而言的動態語言定義是程式執行時,允許改變程式結構或變數型別,這種語言稱為動態語言。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。)語言的一個關鍵性質。

    2、反射能做什麼?

    我們知道反射機制允許程式在執行時取得任何一個已知名稱的class的內部資訊,包括包括其modifiers(修飾符),fields(屬性),methods(方法)等,並可於執行時改變fields內容或呼叫methods。那麼我們便可以更靈活的編寫程式碼,程式碼可以在執行時裝配,無需在元件之間進行原始碼連結,降低程式碼的耦合度;還有動態代理的實現等等;但是需要注意的是反射使用不當會造成很高的資源消耗!

    3、反射的具體實現

    下面是一個基本的類 Person

    ①、得到 Class 的三種方式

    需要注意的是:一個類在 JVM 中只會有一個 Class 例項,即我們對上面獲取的 c1,c2,c3進行 equals 比較,發現都是true

    ②、透過 Class 類獲取成員變數、成員方法、介面、超類、構造方法等

    查閱 API 可以看到 Class 有很多方法:

    getName():獲得類的完整名字。getFields():獲得類的public型別的屬性。getDeclaredFields():獲得類的所有屬性。包括private 宣告的和繼承類getMethods():獲得類的public型別的方法。getDeclaredMethods():獲得類的所有方法。包括private 宣告的和繼承類getMethod(String name, Class[] parameterTypes):獲得類的特定方法,name引數指定方法的名字,parameterTypes 引數指定方法的引數型別。getConstructors():獲得類的public型別的構造方法。getConstructor(Class[] parameterTypes):獲得類的特定構造方法,parameterTypes 引數指定構造方法的引數型別。newInstance():透過類的不帶引數的構造方法建立這個類的一個物件。

    我們透過一個例子來綜合演示上面的方法:

    4、根據反射獲取父類屬性

    父類 Parent.java

    子類 Son.java

    透過執行上述程式碼,我們獲得了父類的私有屬性值,這裡要注意的是直接透過反射獲取子類的物件是不能得到父類的屬性值的,必須根據反射獲得的子類 Class 物件在呼叫 getSuperclass() 方法獲取父類物件,然後在透過父類物件去獲取父類的屬性值。

  • 8 # 河南新華599

    反射機制提供的功能是很強大的 但是客觀性和維護性很差一般反射用在 構造框架 以及工具開發等等但是實際開發軟體運用的並不多下面是一個簡單的例子package com.wqx.test4;public class Test {public void sayhello(String name){System.out.println("hello:"+name);}public static void main(String[] args) {try {//把test 這個類載入記憶體Class c=Class.forName("com.wqx.test4.Test");//建立這個類的例項Object obj=c.newInstance();//透過class來取得這個方法物件 並且宣告 這個類的引數型別java.lang.reflect.Method method=c.getMethod("sayhello", Class.forName("java.lang.String"));//invoke 來執行方法物件 記得引數型別要跟這裡的引數匹配method.invoke(obj, "wqx");} catch (Exception e) {// TODO: handle exception}}}

  • 9 # TT君是新手不是新人

    360問答

    java的反射機制是什麼?

    smshishasho LV13

    2013-07-14

    滿意答案

    dz3185

    LV13

    2013-07-15

    Java 的反射機制是使其具有動態特性的非常關鍵的一種機制,也是在JavaBean 中廣泛應用的一種特性。

    運用JavaBean 的最常見的問題是:根據指定的類名,類欄位名和所對應的資料,得到該類的例項,下面的一個例子演示了這一實現。

    -|Base.java //抽象基類

    |Son1.java //基類擴充套件1

    |Son2.java //基類擴充套件2

    |Util.java

    /**

    * @author metaphy

    * create 2005-4-14 9:06:56

    * 說明:

    */

    (1)Base.java 抽象基類只是一個定義

    public abstract class Base {

    }

    (2)Son1.java /Son2.java 是已經實現的JavaBean

    public class Son1 extends Base{

    private int id ;

    private String name ;

    public int getId() {

    return id;

    }

    public void setId(int id) {

    this.id = id;

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public void son1Method(String s){

    System.out.println(s) ;

    }

    }

    (3)

    public class Son2 extends Base{

    private int id;

    private double salary;

    public int getId() {

    return id;

    }

    public void setId(int id) {

    this.id = id;

    }

    public double getSalary() {

    return salary;

    }

    public void setSalary(double salary) {

    this.salary = salary;

    }

    }

    (4)Util.java 演示瞭如何根據指定的類名,類欄位名和所對應的資料,得到一個類的例項

    import java.lang.reflect.Method;

    public class Util {

    //此方法的最大好處是沒有類名Son1,Son2 可以透過引數來指定,程式裡面根本不用出現

    public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){

    Base base = null ;

    try {

    Class cls = Class.forName(beanName) ;

    base = (Base)cls.newInstance() ;

    Class[] paraTypes = new Class[]{String.class };

    Method method = cls.getMethod(fieldSetter, paraTypes) ;

    String[] paraValues = new String[]{paraValue} ;

    method.invoke(base, paraValues) ;

    } catch (Throwable e) {

    System.err.println(e);

    }

    return base ;

    }

    public static void main(String[] args){

    Son1 son1 =(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha");

    System.out.println("son1.getName() :"+son1.getName()) ;

    }

    }

    //呼叫結果:

    //son1.getName() :wang da sha

  • 10 # 焦慮老爸

    一、什麼是反射?

    Java反射說的是在執行狀態中,對於任何一個類,我們都能夠知道這個類有哪些方法和屬性。對於任何一個物件,我們都能夠對它的方法和屬性進行呼叫。我們把這種動態獲取物件資訊和呼叫物件方法的功能稱之為反射機制。

    二、反射的三種方式

    這裡需要跟大家說一下,所謂反射其實是獲取類的位元組碼檔案,也就是.class檔案,那麼我們就可以透過Class這個物件進行獲取。

    1、第一種方式

    這個方法其實是Object的一個方法,Class繼承了Object,所以我們可以直接使用。

    2、第二種方式

    3、第三種

    這裡需要注意,透過類的全路徑名獲取Class物件會丟擲一個異常,如果根據類路徑找不到這個類那麼就會丟擲這個異常

    那麼這3中方式我們一般選用哪種方式呢?第一種已經建立了物件,那麼這個時候就不需要去進行反射了,顯得有點多此一舉。第二種需要匯入類的包,依賴性太強。所以我們一般選中第三種方式。

    三、透過反射獲取類的構造方法、方法以及屬性

    1、獲取構造方法

    結果:

    2、獲取類屬性

    結果

    這裡需要注意,在獲取私有屬性的時候如果沒有進行暴力反射,那麼會丟擲下面這個異常。

    3、獲取類中的方法

    先定義幾個方法

    透過反射獲取

    結果

    這裡需要注意的就是當一個方法需要傳入多個引數值的時候,一定要注意。踩了一點坑。

    四、反射執行main方法

    反射呼叫

    這裡需要告訴大家,在導String包的時候千萬要看清楚,我在這填了20多分鐘的坑。

    五、總結

    看到這裡你已經對反射有了一個簡單的瞭解,可以使用反射獲取一些屬性方法,其實我們平時寫程式碼很少用到反射技術,但是在我們使用的一些主流框架中反射技術應用是非常廣泛的,所以學好反射也是非常有必要的。

  • 11 # 白天不懂夜地黑裡

    在執行狀態中,對於任意一個類,都能夠獲取到這個類的所有屬性和方法,對於任意一個物件,都能夠呼叫它的任意一個方法和屬性(包括私有的方法和屬性),這種動態獲取的資訊以及動態呼叫物件的方法的功能就稱為java語言的反射機制。通俗點講,透過反射,該類對我們來說是完全透明的,想要獲取任何東西都可以。

        想要使用反射機制,就必須要先獲取到該類的位元組碼檔案物件(.class),透過位元組碼檔案物件,就能夠透過該類中的方法獲取到我們想要的所有資訊(方法,屬性,類名,父類名,實現的所有介面等等),每一個類對應著一個位元組碼檔案也就對應著一個Class型別的物件,也就是位元組碼檔案物件

  • 12 # 千鋒教育官方

    Java中的例項化,其實理解起來也挺簡單.

    舉個栗子,Car car = new Car();

    通常把這條語句的動作稱之為建立一個物件,也就是所謂的例項化過程.

    在這句話中,Car是一個"汽車類",這個"類"可以理解成是一個"工廠裡的模具",然後我們可以根據這個"模具"來創造出"一個具體的產品",這個"具體的產品",也就是所謂的"例項化物件".

    所以呢所謂的例項化,就是根據"類",來創造出一個一個具體的物件!

  • 中秋節和大豐收的關聯?
  • iwatchse40mm和44mm的外形尺寸?