多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Java 反射機制淺析

Java 反射機制淺析

來源:程序員人生   發布時間:2017-02-05 13:52:56 閱讀次數:2872次

學習Java的同學注意了!!! 
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990  我們1起學Java!


      Java反射機制是在運行狀態中,對任意1個,都能夠知道這個類的所有屬性和方法;對任意1個對象,都能夠調用它的任意1個方法和屬性;這類動態獲得的信息和動態調用對象的方法的功能稱為Java語言的反射機制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行動的1種能力。這1概念的提出很快引發了計算機科學領域關于利用反射性的研究。它首先被程序語言的設計領域所采取,并在Lisp和面向對象方面獲得了成績。固然反射本身其實不是1個新概念,它可能會使我們聯想到光學中的反射概念,雖然計算機科學賦予了反射概念新的含義,但是,從現象上來講,它們確切有某些相通的地方,這些有助于我們的理解。

      Java反射機制主要提供下面幾種用處:

  • 在運行時判斷任意1個對象所屬的類
  • 在運行時構造任意1個類的對象
  • 在運行時判斷任意1個類所具有的成員變量和方法
  • 在運行時調用任意1個對象的方法

      首先看1個簡單的例子,通過這個例子來理解Java的反射機制是如何工作的。

復制代碼
package com.wanggc.reflection;

import java.lang.reflect.Method;

/**
* Java 反射練習。
*
*
@author Wanggc
*/
public class ForNameTest {

/**
* 入口函數。
*
*
@param args
* 參數
*
@throws Exception
* 毛病信息
*/
public static void main(String[] args) throws Exception {
// 取得Class
Class<?> cls = Class.forName(args[0]);
// 通過Class取得所對應對象的方法
Method[] methods = cls.getMethods();
// 輸出每一個方法名
for (Method method : methods) {
System.out.println(method);
}
}
}
復制代碼

      當傳入的參數是java.lang.String時,會輸出以下結果

復制代碼
public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(int)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(java.lang.String)
public int java.lang.String.indexOf(java.lang.String,int)
public static java.lang.String java.lang.String.valueOf(int)
public static java.lang.String java.lang.String.valueOf(char)
public static java.lang.String java.lang.String.valueOf(boolean)
public static java.lang.String java.lang.String.valueOf(float)
public static java.lang.String java.lang.String.valueOf(char[],int,int)
public static java.lang.String java.lang.String.valueOf(double)
public static java.lang.String java.lang.String.valueOf(char[])
public static java.lang.String java.lang.String.valueOf(java.lang.Object)
public static java.lang.String java.lang.String.valueOf(long)
public char java.lang.String.charAt(int)
public int java.lang.String.codePointAt(int)
public int java.lang.String.codePointBefore(int)
public int java.lang.String.codePointCount(int,int)
public int java.lang.String.compareToIgnoreCase(java.lang.String)
public java.lang.String java.lang.String.concat(java.lang.String)
public boolean java.lang.String.contains(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
public static java.lang.String java.lang.String.copyValueOf(char[])
public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
public boolean java.lang.String.endsWith(java.lang.String)
public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public void java.lang.String.getBytes(int,int,byte[],int)
public byte[] java.lang.String.getBytes()
public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
public void java.lang.String.getChars(int,int,char[],int)
public native java.lang.String java.lang.String.intern()
public boolean java.lang.String.isEmpty()
public int java.lang.String.lastIndexOf(java.lang.String)
public int java.lang.String.lastIndexOf(int,int)
public int java.lang.String.lastIndexOf(int)
public int java.lang.String.lastIndexOf(java.lang.String,int)
public int java.lang.String.length()
public boolean java.lang.String.matches(java.lang.String)
public int java.lang.String.offsetByCodePoints(int,int)
public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
public java.lang.String java.lang.String.replace(char,char)
public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String)
public boolean java.lang.String.startsWith(java.lang.String,int)
public java.lang.CharSequence java.lang.String.subSequence(int,int)
public java.lang.String java.lang.String.substring(int)
public java.lang.String java.lang.String.substring(int,int)
public char[] java.lang.String.toCharArray()
public java.lang.String java.lang.String.toLowerCase()
public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
public java.lang.String java.lang.String.toUpperCase()
public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
復制代碼

      這樣就列出了java.lang.String類的所有方法名、及其限制符、返回類型及拋出的異常。這個程序使用Class類forName方法載入指定的類,然后調用getMethods方法返回指定類的方法列表。java.lang.reflect.Method用來表述某個類中的單1方法。

      使用java的反射機制,1般需要遵守3步:

    1. 取得你想操作類的Class對象
    2. 通過第1步取得的Class對象去獲得操作類的方法或是屬性名
    3. 操作第2步獲得的方法或是屬性

     Java運行的時候,某個類不管生成多少個對象,他們都會對應同1個Class對象,它表示正在運行程序中的類和接口。如何獲得操作類的Class對象,經常使用的有3種方式:

    1. 調用Class的靜態方法forName,如上例;
    2. 使用類的.class語法,如:Class<?> cls = String.class;
    3. 調用對象的getClass方法,如:String str = "abc";Class<?> cls = str .getClass();

      下面將通過實例講述如何通過前面所訴的3步來履行某對象的某個方法:

復制代碼
 1 package com.wanggc.reflection;
2
3 import java.lang.reflect.Method;
4
5 /**
6 * Java 反射練習。
7 *
8 * @author Wanggc
9 */
10 public class ReflectionTest {
11 public static void main(String[] args) throws Exception {
12 DisPlay disPlay = new DisPlay();
13 // 取得Class
14 Class<?> cls = disPlay.getClass();
15 // 通過Class取得DisPlay類的show方法
16 Method method = cls.getMethod("show", String.class);
17 // 調用show方法
18 method.invoke(disPlay, "Wanggc");
19 }
20 }
21
22 class DisPlay {
23 public void show(String name) {
24 System.out.println("Hello :" + name);
25 }
26 }
復制代碼

      前面說過,Java程序的每一個類都會有個Class對象與之對應。Java反射的第1步就是取得這個Class對象,如代碼14行。固然,每一個類的方法也必有1個Method對象與之對應。要通過反射的方式調用這個方法,就要首先取得這個方法的Method對象,如代碼16行,然后用Method對象反過來調用這個方法,如代碼18行。注意16行getMethod方法的第1個參數是方法名,第2個是此方法的參數類型,如果是多個參數,接著添加參數就能夠了,由于getMethod是可變參數方法。履行18行代碼的invoke方法,其實也就是履行show方法,注意invoke的第1個參數,是DisPlay類的1個對象,也就是調用DisPlay類哪一個對象的show方法,第2個參數是給show方法傳遞的參數。類型和個數1定要與16行的getMethod方法1直。

      上例講述了如何通過反射調用某個類的方法,下面將再通過1個實例講述如何通過反射給某個類的屬性賦值:

復制代碼
  1 package com.wanggc.reflection;
2
3 import java.lang.reflect.Field;
4
5 /**
6 * Java 反射之屬性練習。
7 *
8 * @author Wanggc
9 */
10 public class ReflectionTest {
11 public static void main(String[] args) throws Exception {
12 // 建立學生對象
13 Student student = new Student();
14 // 為學生對象賦值
15 student.setStuName("Wanggc");
16 student.setStuAge(24);
17 // 建立拷貝目標對象
18 Student destStudent = new Student();
19 // 拷貝學生對象
20 copyBean(student, destStudent);
21 // 輸出拷貝結果
22 System.out.println(destStudent.getStuName() + ":"
23 + destStudent.getStuAge());
24 }
25
26 /**
27 * 拷貝學生對象信息。
28 *
29 * @param from
30 * 拷貝源對象
31 * @param dest
32 * 拷貝目標對象
33 * @throws Exception
34 * 例外
35 */
36 private static void copyBean(Object from, Object dest) throws Exception {
37 // 獲得拷貝源對象的Class對象
38 Class<?> fromClass = from.getClass();
39 // 獲得拷貝源對象的屬性列表
40 Field[] fromFields = fromClass.getDeclaredFields();
41 // 獲得拷貝目標對象的Class對象
42 Class<?> destClass = dest.getClass();
43 Field destField = null;
44 for (Field fromField : fromFields) {
45 // 獲得拷貝源對象的屬性名字
46 String name = fromField.getName();
47 // 獲得拷貝目標對象的相同名稱的屬性
48 destField = destClass.getDeclaredField(name);
49 // 設置屬性的可訪問性
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 在线播放国产视频 | 视频在线免费看 | 国产女人的一级毛片视频 | 久久成人小视频 | 色午夜日本高清视频www | 欧美日韩免费一区二区三区 | 国产精品久久久久久久久免费观看 | 精品日韩一区二区三区 | 久久成人亚洲 | japanese日本护士 | 国产亚洲精品久久久久久无 | 欧美成人精品高清在线观看 | 中国a级淫片免费播放 | 久久精品一区二区影院 | 免费a级作爱片免费观看中 免费a网站 | 免费视频不卡一区二区三区 | www色网站| 亚洲综合亚洲综合网成人 | 亚洲乱码卡三乱码新区 | 99欧美在线| 亚洲一区二区三区免费视频 | 久久影视免费观看网址 | 另类色视频 | 吃奶添下面大尺度视频 | 午夜在线网站 | 成人性生免费视频 | 亚洲天堂成人网 | wwwjizz欧美| 亚洲欧美色中文字幕 | 国产国语在线播放视频 | 天天综合亚洲国产色 | 一二三四在线手机观看视频 | 一区二区三区在线免费视频 | 在线中文| 特级a欧美做爰片毛片 | www.国产福利| 亚洲精品乱码久久久久久v 亚洲精品乱码久久久久久蜜桃 | 亚洲美女又黄又爽在线观看 | 日韩欧美精品中文字幕 | 一区二区三区日本视频 | 国产精品国产三级国产a |