1. 程式人生 > >【原】Java反射機制的原理及在Android下的簡單應用

【原】Java反射機制的原理及在Android下的簡單應用

轉載地址:http://www.cnblogs.com/crazypebble/archive/2011/04/13/2014582.html

  花了幾天時間,研究了一下Java的反射機制。在這裡總結一下這幾天學習的成果,一來分享自己的學習過程和在學習中遇到的問題,二來是給像我一樣不太瞭解Java反射機制的同學做一個簡單的介紹。在文章後面會連結一個Android反射機制的應用程式。

一、反射的概念及在Java中的類反射

  反射主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。在電腦科學領域,反射是一類應用,它們能夠自描述和自控制。這類應用通過某種機制來實現對自己行為的描述和檢測,並能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。

  在Java中的反射機制,被稱為Reflection。(大家看到這個單詞,第一個想法應該就是去開發文件中搜一下了。)它允許執行中的Java程式對自身進行檢查,並能直接操作程式的內部屬性或方法。Reflection機制允許程式在正在執行的過程中,利用Reflection APIs取得任何已知名稱的類的內部資訊,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,並可以在執行的過程中,動態生成

Instances、變更fields內容或喚起methods

  好,瞭解這些,那我們就知道了,我們可以利用反射機制在Java程式中,動態的去呼叫一些protected甚至是private的方法或類,這樣可以很大程度上滿足我們的一些比較特殊需求。你當然會問,反射機制在Android平臺下有何用處呢?

  我們在進行Android程式的開發時,為了方便除錯程式,並快速定位程式的錯誤點,會從網上下載到對應版本的Android SDK的原始碼(這裡給大家提供一個2.3.3版本的下載連結)。你會發現很多類或方法中經常加上了“@hide”註釋標記,它的作用是使這個方法或類在生成SDK時不可見,那麼我們的程式可能無法編譯通過,而且在最終釋出的時候,就可能存在一些問題。

  那麼,對於這個問題,第一種方法就是自己去掉Android原始碼中的"@hide"標記,然後重新編譯生成一個SDK。另一種方法就是使用Java反射機制了,可以利用這種反射機制訪問存在訪問許可權的方法或修改其域。

  廢話半天,該入正題了,在進入正題之前,先給上一個反射測試類的程式碼,該程式碼中定義了我們需要進行反射的類,該類並沒有實際的用途,僅供做為測試類。提示:本文提供的程式碼,並不是Android平臺下的程式碼,而是一個普通的Java程式,僅僅是對Java反射機制的Demo程式,所以大家不要放在Android下編譯啊,否則出現問題,別追究我的責任啦!

ReflectionTest.java

二、反射機制中需要使用到的類

  我把需要使用的類列在下表中,其中對我們特別有用的類,通過著重標記顯示出來,並將在後面的使用中逐步解釋:

三、Class

  首先向大家說明一點,Class本身就是一個類,Class是該類的名稱。看以下下面這個類的定義:

  public class MyButton extends Button {...}

  注意到上面的class的首字母是小寫,它表示的是一種類型別,但是我們的Class是一個類,相當於上面定義的MyButton類。所以,千萬不要把這裡的Class做為一個類型別來理解。明白這一點,我們繼續。

  Class類是整個Java反射機制的源頭,Class類本身表示Java物件的型別,我們可通過一個Object物件的getClass()方法取得一個物件的型別,此函式返回的就是一個Class類。獲取Class物件的方法有很多種:

  在平時的使用,要注意對這幾種方法的靈活運用,尤其是對Class.forName()方法的使用。因為在很多開發中,會直接通過類的名稱取得Class類的物件。

四、獲取類的相關資訊

1、獲取構造方法

  Class類提供了四個public方法,用於獲取某個類的構造方法。

    Constructor getConstructor(Class[] params)     根據建構函式的引數,返回一個具體的具有public屬性的建構函式

    Constructor getConstructors()     返回所有具有public屬性的建構函式陣列

    Constructor getDeclaredConstructor(Class[] params)     根據建構函式的引數,返回一個具體的建構函式(不分public和非public屬性)

    Constructor getDeclaredConstructors()    返回該類中所有的建構函式陣列(不分public和非public屬性)

  由於Java語言是一種面向物件的語言,具有多型的性質,那麼我們可以通過構造方法的引數列表的不同,來呼叫不同的構造方法去建立類的例項。同樣,獲取不同的構造方法的資訊,也需要提供與之對應的引數型別資訊;因此,就產生了以上四種不同的獲取構造方法的方式。

get_Reflection_Constructors()

2、獲取類的成員方法

  與獲取構造方法的方式相同,存在四種獲取成員方法的方式。

    Method getMethod(String name, Class[] params)    根據方法名和引數,返回一個具體的具有public屬性的方法

    Method[] getMethods()    返回所有具有public屬性的方法陣列

    Method getDeclaredMethod(String name, Class[] params)    根據方法名和引數,返回一個具體的方法(不分public和非public屬性)

    Method[] getDeclaredMethods()    返回該類中的所有的方法陣列(不分public和非public屬性)

get_Reflection_Method()

  在獲取類的成員方法時,有一個地方值得大家注意,就是getMethods()方法和getDeclaredMethods()方法。

    getMethods():用於獲取類的所有的public修飾域的成員方法,包括從父類繼承的public方法和實現介面的public方法;

    getDeclaredMethods():用於獲取在當前類中定義的所有的成員方法和實現的介面方法,不包括從父類繼承的方法。

  大家可以查考一下開發文件的解釋:

getMethods() - Returns an array containing Method objects for all public methods for the class C represented by this Class. 

         Methods may be declared in C, the interfaces it implements or in the superclasses of C. 

         The elements in the returned array are in no particular order. 

getDeclaredMethods() - Returns a Method object which represents the method matching the specified name and parameter types 

              that is declared by the class represented by this Class. 

  因此在示例程式碼的方法get_Reflection_Method(...)中,ReflectionTest類繼承了Object類,實現了actionPerformed方法,並定義如下成員方法:

    

  通過這兩個語句執行後的結果不同:

相關推薦

Java反射機制原理Android簡單應用

轉載地址:http://www.cnblogs.com/crazypebble/archive/2011/04/13/2014582.html   花了幾天時間,研究了一下Java的反射機制。在這裡總結一下這幾天學習的成果,一來分享自己的學習過程

高清顯示屏原理設計方案

接近年底了,又到產品們趕KPI的時間,開發也跟著辛苦,於是連續加班了4個星期,專案總算有點起色,也終於擠出點時間,寫篇文章,just for fun ~ 高清顯示屏原理 ,之前在團隊內做過的一個類似的分享,因為上次有園友問了我 手機端css sprite 的設計原理,不知道手機端的圖片為什麼是用2倍大,背景

javajava反射機制,動態獲取對象的屬性和對應的參數值,並屬性按照字典序排序,Field.setAccessible()方法的說明可用於微信支付 簽名生成

modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private

java反射原理使用

int port mar unit .class 使用方法 www. fec pos 定義 JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的

Java學習筆記034 - 網絡

端口號 bre throws clas 編程 綁定 容器 名稱 套接字 1 package cn.temptation; 2 3 import java.net.InetAddress; 4 5 public class Sample01 {

Java 反射機制原理

反射的概念 反射的概念是由Smith在1982年首次提出的,主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。這一概念的提 出很快引發了電腦科學領域關於應用反射性的研究。它首先被程式語言的設計領域所採用,並在Lisp和麵向物件方面取得了成績。其中 LEAD/LEAD++ 、Open

SocketJava Socket程式設計基礎深入講解

Socket是Java網路程式設計的基礎,瞭解還是有好處的,   這篇文章主要講解Socket的基礎程式設計。Socket用在哪呢,主要用在程序間,網路間通訊。本篇比較長,特別做了個目錄: 一、Socket通訊基本示例   這種模式是基礎,必須掌

NLPCNN文字分類原理python程式碼實現

CNN分類模型架構   python程式碼實現: #!/usr/bin/python # -*- coding: utf-8 -*- import tensorflow as tf class TCNNConfig(object): #class TCNNConfig(

MyBatisMyBatis Tomcat JNDI原理原始碼分析

一、 Tomcat JNDI JNDI(java nameing and drectory interface),是一組在Java應用中訪問命名和服務的API,所謂命名服務,即將物件和名稱聯絡起來,使得可以通過名稱訪問並獲取物件。 簡單

Java學習筆記034

1 package cn.temptation; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.ne

Java學習筆記033

1 package cn.temptation; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream;

Java學習筆記032

1 package cn.temptation; 2 3 public class Sample03 { 4 public static void main(String[] args) { 5 /* 6 * Thread類的常用成員方法:

SocketJava Socket程式設計基礎深入講解(轉載)

Socket是Java網路程式設計的基礎,瞭解還是有好處的,   這篇文章主要講解Socket的基礎程式設計。Socket用在哪呢,主要用在程序間,網路間通訊。本篇比較長,特別做了個目錄: 一、Socket通訊基本示例   這種模式是基礎,必須掌握,後

zookeeper事件 watch 機制 原理

zk作為一款成熟的分散式協調框架,訂閱-釋出功能是很重要的一個。所謂訂閱釋出功能,其實說白了就是觀察者模式。觀察者會訂閱一些感興趣的主題,然後這些主題一旦變化了,就會自動通知到這些觀察者。 zk的訂閱釋出也就是watch機制,是一個輕量級的設計。因為它採用了一種推拉結合的模

Java反射機制在工廠模式中的應用

在本篇文章中就不詳細介紹工廠模式,主要介紹一下反射在工廠模式中的使用,讓讀者對反射機制帶來的好處有更深的認識。 首先看一下簡單工廠模式 簡單工廠模式(simple factory)是類的建立模式,又叫靜態工廠方法(static factory method)模式。 簡單工廠

常見CSS3屬性對ios&android&winphone的支援

2個月前,我在博文《webapp開發中相容Android4.0以下版本的css hack》中寫過“那對於做移動網頁開發的同事來說,一般只要做好webkit核心瀏覽器的展現效果就行了” ,在這裡糾正下,在目前Wepapp開發中,主要對webkit核心的手機做好各個版本的相容已經不夠了,像其它的高階智慧手機,在市

Java面試題spring+springMVC+mybatis原理實現機制(持續更新)

本文將持續更新,主要講解SSM框架的底層原理和實現機制等 1.什麼是IOC? IOC即Inverse of Control,它包括兩個內容:控制與反轉 那到底什麼東西的“控制”被“反轉”了呢?對於軟體而言,即是某一個介面具體實現類的選擇控制權從呼叫類中移除,轉交給第三

Java學習---快速掌握RPC原理實現

消費者 阿裏 局限 kryo nes 很多 cal 網絡 href 【原文】https://www.toutiao.com/i6592365493435236872/ ?RPC概述 RPC(Remote Procedure Call)即遠程過程調用,也就是說兩臺服務器A,

Java反射機制原理

一、概念 java程式執行時動態的建立類並呼叫類的方法和屬性   二、原理簡介 Class<?> clz = Class.forName("java.util.ArrayList"); ArrayList object = (ArrayLis

Java反射機制原理Android簡單應用

package crazypebble.reflectiontest;import java.lang.reflect.Constructor;import java.lang.reflect.Method;publicclass LoadMethod { /** * 在執行時載入指定的類,並呼