1. 程式人生 > >Java的反射機制之反向抽菸

Java的反射機制之反向抽菸

show me the code and take to me,做的出來更要說的明白
GitHub專案JavaHouse同步收錄
喜歡就點個讚唄! 你的支援是我分享的動力!

引入

反射是一種不按套路處出牌的機制。通常我們接觸的方式都是 "正射",暫且起這個名字。雖然我們用的少,但是反射其實就在我們日常開發中。比如我們常見的空指標異常,或者是 Spring 的各種註解配置建立物件等等。

正常操作

ReflectTest reflectTest = new ReflectTest();
reflectTest.setName("boolenbl公眾號");
System.out.println(reflectTest.getName());

一般我們使用上面方法建立物件以及初始化屬性。並且有嚴格的訪問規則。但是反射就反其道為之。他利用 Class、 Method、 Field等類,隨意建立物件,獲取公有、私有的方法,獲取私有的、共有的方法。

Class 類

Class 類只有私有的構造方法,因此我們不能初始化該對物件,不過 Class 類也不是給我們使用的。 Class 類只能被 JVM 呼叫。有圖有真相:

獲取Class 類

有三種方法可以獲取到 Class 類。程式碼如下:

// 方法1
System.out.println(ReflectTest.class);
// 方法2
System.out.println(new ReflectTest().getClass());
// 方法3  包名+類名 (JDBC那種操作) 有異常
System.out.println(Class.forName("基礎.ReflectTest"));
// 獲取類名
System.out.println(ReflectTest.class.getName());

獲取方法

利用該方法可以無視訪問規則,獲取所有的方法。程式碼如下:

System.out.println(Arrays.toString(ReflectTest.class.getDeclaredMethods()));

獲取屬性

利用該方法可以無視訪問規則,獲取所有的屬性。程式碼如下:

System.out.println(Arrays.toString(ReflectTest.class.getDeclaredFields()));

獲取構造器

reflectTestClass.getConstructor();

從正常到異常(反射操作物件)

Class<ReflectTest> reflectTestClass = ReflectTest.class;
Method method = reflectTestClass.getMethod("setName", String.class);
Constructor<ReflectTest> constructor = reflectTestClass.getConstructor();
reflectTest = constructor.newInstance();
method.invoke(reflectTest, "公眾號");
System.out.println(reflectTest.getName());

完整程式碼

package 基礎;

import lombok.Data;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @Description: 反射測試
 * @Author: boolean
 * @Date: 2019/12/26 17:01
 */
@Data
public class ReflectTest {
    private String name;
    private String pass;

    @Test
    public void test() throws NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
        /**
         * 前提獲取 Class 類
         */
        // 方法1
        System.out.println(ReflectTest.class);
        // 方法2
        System.out.println(new ReflectTest().getClass());
        // 方法3  包名+類名 (JDBC那種操作) 有異常
        System.out.println(Class.forName("基礎.ReflectTest"));
        // 獲取類名
        System.out.println(ReflectTest.class.getName());
        // 獲取方法
        System.out.println(Arrays.toString(ReflectTest.class.getDeclaredMethods()));
        // 獲取屬性
        System.out.println(Arrays.toString(ReflectTest.class.getDeclaredFields()));

        // 正常建立物件並初始化
        ReflectTest reflectTest = new ReflectTest();
        reflectTest.setName("boolenbl公眾號");
        System.out.println(reflectTest.getName());

        // 反射建立物件並初始化
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        Constructor<ReflectTest> constructor = reflectTestClass.getConstructor();
        reflectTest = constructor.newInstance();
        Method method = reflectTestClass.getMethod("setName", String.class);
        method.invoke(reflectTest, "公眾號");
        System.out.println(reflectTest.getName());
    }

    public void test1(){

    }

    public void test2(){

    }

    public void test3(){

    }
}

執行結果

class 基礎.ReflectTest
class 基礎.ReflectTest
class 基礎.ReflectTest
基礎.ReflectTest
[public boolean 基礎.ReflectTest.equals(java.lang.Object), public java.lang.String 基礎.ReflectTest.toString(), public int 基礎.ReflectTest.hashCode(), public java.lang.String 基礎.ReflectTest.getName(), public void 基礎.ReflectTest.setName(java.lang.String), public void 基礎.ReflectTest.test() throws java.lang.NoSuchMethodException,java.lang.ClassNotFoundException,java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException,java.lang.InstantiationException, protected boolean 基礎.ReflectTest.canEqual(java.lang.Object), public void 基礎.ReflectTest.test3(), public void 基礎.ReflectTest.test2(), public void 基礎.ReflectTest.test1(), public java.lang.String 基礎.ReflectTest.getPass(), public void 基礎.ReflectTest.setPass(java.lang.String)]
[private java.lang.String 基礎.ReflectTest.name, private java.lang.String 基礎.ReflectTest.pass]
boolenbl公眾號
公眾號

參考

https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html
sczyh30.com/posts/Java/java-reflection-1/
https://juejin.im/post/598ea9116fb9a03c335a99a4

關注微信公眾號,隨時移動端閱讀

相關推薦

Java反射機制反向抽菸

show me the code and take to me,做的出來更要說的明白 GitHub專案JavaHouse同步收錄 喜歡就點個讚唄! 你的支援是我分享的動力! 引入 反射是一種不按套路處出牌的機制。通常我們接觸的方式都是 "正射",暫且起這個名字。雖然我們用的少,但是反射

java 反射機制 getMethods獲取所有公有方法 和 getDeclaredMethods 獲取本類所有方法

檔案結構: Person: package demo2; public class Person { private int age; private String name; public Person( String name,int ag

java反射機制Method invoke執行呼叫方法例子

昨天在群裡跟大家討論了下java反射呼叫可變引數的問題,這個問題起因是我們需要反射呼叫另一個部門提供的方法,我同事說java不能反射呼叫可變引數的方法,於是我寫了個demo證明了他這個觀點的錯誤。但是測試過程中,有一點我不明白,就是反射呼叫可變引數的方法時,為什麼一定

java反射機制應用動態代理

代理類 過多 size bject interface 並且 編譯期 代理 抽象 1.靜態代理類和動態代理類區別 靜態代理:要求被代理類和代理類同時實現相應的一套接口;通過代理類的對象調用重寫接口的方法時,實際上執行的是被代理類的同樣的 方法的調用。 動態代理:在程序運

Java 基礎詳解 Java 反射機制

一行代碼 strac classname for 內部 系統資源 用戶 管理 ann 一、什麽是 Java 的反射機制? ??反射(Reflection)是Java的高級特性之一,是框架實現的基礎,定義:JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有

面試題------Java 反射機制

orange 是不是 rac 匿名對象 結果 創建 一起 使用 edi 一、反射機制概述 Java 反射機制是在運行狀態中,對於任意一個類,都能夠獲得這個類的所有屬性和方法,對於任意一個對象都能夠調用它的任意一個屬性和方法。這種在運行時動態的獲取信息以及動態調用對象

java反射機制getDeclaredMethods和getMethods的區別

-c col random sys rgs methods ember min () getMethods() 返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼

Spring學習5(1):IoC容器IoC概述,JAVA反射機制,資源訪問器

spring學習5(1)  在經過了對spring框架基本開發的瞭解以及對spring boot流程的學習,《精通spring4.x…》這本書正式開始了spring的講解,我也跟隨著這本書的腳步進行學習。 IoC概述  首先需要學習的是spring的IoC技術,

Spring IOC原理Java反射機制

1、反射概念以及為什麼要使用反射 我們考慮一個場景,如果我們在程式執行時,一個物件想要檢視自己所擁有的成員屬性,該如何操作? 那再考慮這樣另一個場景,如果我們想要在執行期獲得某個類Class的資訊如它

Java反射機制總結

1.要想使用反射,首先需要獲得待處理類或物件所對應的Class物件。 2.獲取某個類或物件所對應的Class地下的常用三中方法 3.若通過類的不帶引數的構造方法來生成物件,我們有兩種方式:  3.1  3.2  4.若想通過帶引數的構造方法生成例項,必須採用3.2的方法才

構建自己的Java Web框架(三)JAVA反射機制

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

java反射機制

else ++ 類型 應該 動態 error param 字母 什麽 最近在做一個項目。 需求是這樣的,前端傳一個參數param表示要從服務器獲取的參數,後端需要把對應的參數從服務器中取出來。 本來覺得沒什麽,應該蠻簡單。結果一看表,嗯,40多個參數,如果用if...els

Java反射機制深入詳解

const 運行時 設計 應用程序 類加載器 分配 import 程序 為什麽 一.概念   反射就是把Java的各種成分映射成相應的Java類。   Class類的構造方法是private,由JVM創建。   反射是java語言的一個特性,它允程序在運行時(註意不是編譯的

利用JAVA反射機制實現調用私有方法

parse try ble cat 權限 利用 enabled tde mod 1.fragment是AccessibilityFragment的對象。須要被調用的方法的類。 setAccessible(true)並非將方法的訪問權限改成了public。而是取

Java反射機制詳解一

java 反射 反射機制 工廠模式 1反射機制是什麽反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。在面向對象的世界裏,萬事萬物皆對象.在ja

java 反射機制 觀點

pan sse clipboard star -s cin clip att repl 反射,當時經常聽他們說,自己也看過一些資料,也可能在設計模式中使用過,但是感覺對它沒有一個較深入的了解,這次重新學習了一下,感覺還行吧! 一,先看一下反

候捷談Java反射機制

將在 內省 編程 pub pop 批處理 cdecl 清理 void 2013-06-12 22:51 1690人閱讀 評論(0) 收藏 舉報 分類: JAVA(51) 傳送門:http://blog.csdn.net/njchenyi/article

Java反射機制詳解

ride length 數組大小 conf array arraycopy 動態調用 ray info Java反射機制詳解 |目錄 1反射機制是什麽 2反射機制能做什麽 3反射機制的相關API ·通過一個對象獲得完整的包名和類名 ·實例化Class類對象 ·獲

java 反射機制

選擇 count 語言 用戶 方案 獲取 接口 功能 .cn 一、java反射機制是什麽?   JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為j

Java反射機制demo(五)—獲得並調用一個類中的方法

color 擁有 oca logs over super getmethod equals() bool 這個demo在使用反射機制操作屬性之前,主要原因是因為在.class文件字節碼中,方法排在屬性的前面。 1,獲得一個類中的方法 先看一下方法和運行結果。獲取所有的方