1. 程式人生 > >Java 反射的入門用法示例

Java 反射的入門用法示例

前言:反射:動態獲取類 (位元組碼檔案 如本篇中的Person.class),並對其成員進行執行。反射在Android應用層的開發中可能遇到會稍微少一點,但對於想打通底層的小夥伴來說,必須要熟練掌握運用。
原文出處:http://blog.csdn.net/u014158743/article/details/52939229

實體類

Person.java

package com.sunwenou.reflect;// 包名

public class Person {

    private String name;
    private int age;

    public
Person() {// 無參 } public Person(String name, int age) {// 帶參 super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return
age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name+","+age; } public void show() { // 空參 System.out.println("show"); } public void fun(String ss) { // 帶參 System.out.println(ss); } public
static void function() { // 靜態 System.out.println("static"); } }

動態獲取位元組碼檔案的方法

本篇中為使博文看起來簡介,一概丟擲Exception,並省略import,下同。

package com.sunwenou.reflect;

public class Demo1 {

    /**
     * 動態獲取位元組碼檔案的方法
     * 1:使用Object類提供的 Class getClass()方法
     *   這種方法需要物件
     * 2:每種資料型別都有一個靜態的class屬性,這個屬性返回的這種資料型別所屬位元組碼檔案物件
     *   int.class   Person.class
     * 3:使用 Class提供的 forName()方法
     *   只需要提供一個字串,這個字串由 包名+類名 構成
     */
    public static void main(String[] args) throws Exception {
        //getClaz();

        //getCalz2();

        getClaz3();

    }
    //使用 Class提供的 forName()方法
    public static void getClaz3() throws Exception {
        Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
        Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person");

        System.out.println(claz==claz2);
    }
    //每種資料型別都有一個靜態的class屬性
    public static void getCalz2() {
        Class<Person> p1 = Person.class;
        Class<Person> p2 = Person.class;

        System.out.println(p1==p2);
    }
    //使用Object類提供的 Class getClass()方法
    public static void getClaz() {
        Person person1 = new Person();
        Class<? extends Person> claz = person1.getClass();//Person.class

        Person person2 = new Person();
        Class<? extends Person> claz2 = person2.getClass();//Person.class

        System.out.println(claz==claz2);

    }

}

動態獲取類,並建立物件

package com.sunwenou.reflect;
public class Demo2 {

    public static void main(String[] args) throws Exception {

        //createObj();

        createObj2();
    }

    public static void createObj2() throws Exception {
        //Person person = new Person("lisi",23);
        //得到位元組碼檔案物件
        Class<?>  claz = Class.forName("com.sunwenou.reflect.Person");//Person.class

        //得到帶引數的構造方法所屬的Constructor型別的物件
        Constructor constructor = claz.getConstructor(String.class,int.class);

        //使用Constructor類提供的建立物件的方法建立物件
        Person person = (Person)constructor.newInstance("lisi",23);

        System.out.println(person);

    }

    public static void createObj() throws Exception {
        //Person person = new Person();
        //得到位元組碼檔案物件
        Class<?>  claz = Class.forName("com.sunwenou.reflect.Person");

        Object obj = claz.newInstance();//預設使用空參的構造方法建立物件

        System.out.println(obj);
    }

}

動態獲取類併為成員變數賦值

package com.sunwenou.reflect;
public class Demo3 {

    public static void main(String[] args) throws Exception {

        //Person p = new Person();
        //p.name = "lisi";
        //得到位元組碼檔案物件
        Class<?>  claz = Class.forName("com.sunwenou.reflect.Person");
        //得到成員變數所屬的Field型別的物件
        //Field field = claz.getField("name");//得到的是public許可權的成員
        Field field = claz.getDeclaredField("name");//得到所有宣告的欄位
        System.out.println(field);

        //非靜態成員變數是依賴於物件的
        Object obj = claz.newInstance();

        field.setAccessible(true);//暴力破解, 設定為可訪問的
        field.set(obj, "張三");

        System.out.println(obj);
    }

}

動態獲取類,並執行方法

package com.sunwenou.reflect;
public class Demo4 {
    public static void main(String[] args) throws Exception {

        //method1();

        method2();

        method3();

    }
    public static void method3() throws Exception {
        //得到位元組碼檔案物件
        Class<?>  claz = Class.forName("com.sunwenou.reflect.Person");

        Method m = claz.getMethod("function", null);

        m.invoke(null, null);


    }
    ////執行帶引數的方法
    public static void method2() throws Exception {
        //得到位元組碼檔案物件
        Class<?>  claz = Class.forName("com.sunwenou.reflect.Person");

        Method m = claz.getMethod("fun", String.class);

        Object obj = claz.newInstance();

        m.invoke(obj, "hello");

    }

    //執行無參的方法
    public static void  method1() throws Exception {
        //Person person = new Person(); person.show();
        //得到位元組碼檔案物件
        Class<?>  claz = Class.forName("com.sunwenou.reflect.Person");

        //得到被執行的方法所屬的位元組碼檔案物件
        Method m = claz.getMethod("show", null);

        //非靜態方法是依賴於物件的
        Object obj = claz.newInstance();

        //執行方法
        m.invoke(obj, null);
    }

}

這就是反射的基本用法,我們就可以在不能通過正常建立物件的時候通過物件的位元組碼檔案來建立物件,並執行其中的方法,你學會了嗎??

相關推薦

Java 反射入門用法示例

前言:反射:動態獲取類 (位元組碼檔案 如本篇中的Person.class),並對其成員進行執行。反射在Android應用層的開發中可能遇到會稍微少一點,但對於想打通底層的小夥伴來說,必須要熟練掌握運用。 原文出處:http://blog.csdn.

Java 反射經常用法演示樣例

declared 演示 art dsm red cls div rgs public <pre name="code" class="java">import java.lang.reflect.Constructor; import java.lang.r

java反射用法

用法 block bsp protected image ide 是把 ima pre 反射(運行時的類信息),在java裏面得到了大量的使用,尤其是在一些框架裏面(註解等等),多多少少都會用到反射,了解java的反射,對我們以後學習框架和寫框架都會起到非常的重要! Cla

Java 反射用法 有關Class類的解釋

dex str 類型 nbsp java 三種 .class mooc 有關 package com.imooc.test;public class ClassDemo1 { public static void main(String[] args) {

瞭解java反射用法

小編最近重新看了下java反射,如何取物件,屬性,方法等,然後做了簡單的test測試,在此分享一下。 程式設計師不多說,直接上程式碼。 我們建一個類Myclass,設定私有屬性a,public屬性b public class MyClass { private String a

Java 反射常用方法示例

<pre name="code" class="java">import java.lang.reflect.Constructor; import java.lang.reflect.F

Java反射用法詳解

      Java反射作為其動態語言的標誌性特點之一我們很有必要掌握,至少得知道其基本用法~ ~本文嘗試著從構造器、屬性、方法這三點進行講解反射的用法。在開始之前我先準備好了一個Person類,此類包含了有參構造器、無參構造器、私有屬性、公開屬性、以及私有方法和公開方法。

Java入門到放棄》入門篇:springMVC基本用法

java springmvc springMVC可以理解成用來做數據顯示處理的框架,主要內容就是控制器和視圖的處理。在已經安裝了spring框架的基礎上繼續下面的步驟(我使用的MyEclipse2014)。 1. 修改web.xml文件 2. 在WEB-INF目錄創建springmvc的配

Java反射之getGenericSuperclass()用法

gets 獲得 target nor com ria 反射 log weight 父類 package com.itheima.mytest;public class Person<T1, T2> {} 子類 package com.itheima.m

大白話說Java反射入門、使用、原理

  java的反射機制就是增加程式的靈活性,避免將程式寫死到程式碼裡, 例如: 例項化一個 person()物件, 不使用反射, new person(); 如果想變成 例項化 其他類, 那麼必須修改原始碼,並重新編譯。 使用反射: class.forName

Java反射的簡單入門

ceo 對象 exceptio 是不是 入門 port .com ssi get   1.Class的簡單介紹  Class類的類表示正在運行的Java應用程序中的類和接口。 枚舉是一種類,一個註解是一種接口, 每個數組也屬於一個反映為類對象的類,該對象由具有相同元素類型和

Java隨機訪問流RandomAccessFile用法示例

Java隨機訪問流RandomAccessFile用法示例 Java 寫一個檔案, 寫入26個小寫字母,再開啟這個檔案, 把前10個換成大寫字母,後10個替換為數字字元. 這裡主要是用RandomAccessFile隨機訪問流來處理這個問題: import j

Java反射reflect學習 Class.forName()用法詳解

恰巧前段時間面試的時候問到了Java的反射,當時答得不是很好,正好抽空重新溫習下,本文只講解下通過反射獲取到類的屬性、構造方法、方法,關於類載入器(ClassLoader)將在其他文章中有具體介紹,本文不作介紹。 Class.forName()用法詳解 主要功能 Class.forN

Java反射的一些用法

 // 利用反射獲取類的每個屬性 並用屬性名作為KEY 儲存屬性值 到本地  private void saveFileConfig(SettingConfig config) {         try {             SharedPreferences

Java反射中Method類invoke方法的用法

對帶有指定引數的指定物件呼叫由此 Method 物件表示的底層方法。個別引數被自動解包,以便與基本形參相匹配,基本引數和引用引數都隨需服從方法呼叫轉換。 如果底層方法是靜態的,那麼可以忽略指定的 obj 引數。該引數可以為 null。 如果底層方法所需的形引數為

Java反射之Field用法

在Java反射中Field用於獲取某個類的屬性或該屬性的屬性值 一:如何通過Field反射獲取類的屬性  Field提供如下幾種方法: :1:Class.getDeclaredField(String name); 返回一個 Field 物件,該物件反映此 C

JAVA反射簡介與使用示例

JAVA中的反射,所說的意思就是我們可以在程式執行期間內,動態獲取某一個Class物件的所有資訊,包括修飾符(modifiers),屬性(fields),方法(methods)等。 舉個例子就好比家裡的防盜門,各種Class物件就是來敲門的各種人,當我們獲取到一個未知其內容的Class物件的

學以致用——Java原始碼——命令列引數的用法示例(任意個數字連乘)(Command-Line Arguments)

參考文章: 1. 命令列中執行帶引數的java程式(Command-Line Arguments),https://blog.csdn.net/hpdlzu80100/article/details/51851440  2. 學以致用——Java原始碼——使

java中關於時間的用法示例

除了lambda表示式,stream以及幾個小的改進之外,Java 8還引入了一套全新的時間日期API,在本篇教程中我們將通過幾個簡單的任務示例來學習如何使用Java 8的這套API。Java對日期,日曆及時間的處理一直以來都飽受詬病,尤其是它決定將java.util.D

java多執行緒:volatile及Timer用法示例

最近寫程式時,需要在java中使用多執行緒共享程式變數。 特別地,我需要另一個執行緒中執行類A的方法function_1。但給定的執行時間只有n毫秒,也就是說我會在n毫秒之後終止function_1的執行。 但問題是,我在主執行緒隨後的程式碼中無法判斷funcion_1是壽