程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java反射機制詳解

Java反射機制詳解

編輯:關於JAVA

Java反射機制詳解。本站提示廣大學習愛好者:(Java反射機制詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java反射機制詳解正文


本文的需求是將一組數據按某一字段中文拼音排序,分享給年夜家Android完成中文按拼音排序辦法,供年夜家參考,詳細內容以下
1、Test測試類:

PinyinComparator comparator = new PinyinComparator(); 
    Collections.sort(strList, comparator); 

個中strList中放置了數據,可所以任何對象,但要對PinyinComparator中的compare停止對應的修正,我Demo中為String[]。

2、PinyinComparator排序類:

public class PinyinComparator implements Comparator<Object> { 
  /** 
   * 比擬兩個字符串 
   */ 
  public int compare(Object o1, Object o2) { 
    String[] name1 = (String[]) o1; 
    String[] name2 = (String[]) o2; 
    String str1 = getPingYin(name1[0]); 
    String str2 = getPingYin(name2[0]); 
    int flag = str1.compareTo(str2); 
    return flag; 
  } 
 
  /** 
   * 將字符串中的中文轉化為拼音,其他字符不變 
   * 
   * @param inputString 
   * @return 
   */ 
  public String getPingYin(String inputString) { 
    HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); 
    format.setCaseType(HanyuPinyinCaseType.LOWERCASE); 
    format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 
    format.setVCharType(HanyuPinyinVCharType.WITH_V); 
 
    char[] input = inputString.trim().toCharArray();// 把字符串轉化成字符數組 
    String output = ""; 
 
    try { 
      for (int i = 0; i < input.length; i++) { 
        // \\u4E00是unicode編碼,斷定是否是中文 
        if (java.lang.Character.toString(input[i]).matches( 
            "[\\u4E00-\\u9FA5]+")) { 
          // 將漢語拼音的全拼存到temp數組 
          String[] temp = PinyinHelper.toHanyuPinyinStringArray( 
              input[i], format); 
          // 取拼音的第一個讀音 
          output += temp[0]; 
        } 
        // 年夜寫字母轉化成小寫字母 
        else if (input[i] > 'A' && input[i] < 'Z') { 
          output += java.lang.Character.toString(input[i]); 
          output = output.toLowerCase(); 
        } 
        output += java.lang.Character.toString(input[i]); 
      } 
    } catch (Exception e) { 
      Log.e("Exception", e.toString()); 
    } 
    return output; 
  } 
} 

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

�時刻就必需要曉得所需類的外部信息,這使反射成為構建靈巧的運用的重要對象。

反射的經常使用類和函數:Java反射機制的完成要借助於4個類:Class,Constructor,Field,Method;個中class代 表的是類對象,Constructor-類的結構器對象,Field-類的屬性對象,Method-類的辦法對象,經由過程這四個對象我們可以粗略的看到一個類的各個構成部門。個中最焦點的就是Class類,它是完成反射的基本,它包括的辦法我們在第一部門曾經停止了根本的論述。運用反射時我們最關懷的普通是一個類的結構器、屬性和辦法,上面我們重要引見Class類中針對這三個元素的辦法:

1、獲得結構器的辦法

Constructor getConstructor(Class[] params) -- 取得應用特別的參數類型的公共結構函數,

Constructor[] getConstructors() -- 取得類的一切公共結構函數

Constructor getDeclaredConstructor(Class[] params) -- 取得應用特定參數類型的結構函數(與接入級別有關)

Constructor[] getDeclaredConstructors() -- 取得類的一切結構函數(與接入級別有關)

2、取得字段信息的辦法

Field getField(String name) -- 取得定名的公共字段

Field[] getFields() -- 取得類的一切公共字段

Field getDeclaredField(String name) -- 取得類聲明的定名的字段

Field[] getDeclaredFields() -- 取得類聲明的一切字段
3、取得辦法信息的辦法

Method getMethod(String name, Class[] params) -- 應用特定的參數類型,取得定名的公共��法

Method[] getMethods() -- 取得類的一切公共辦法

Method getDeclaredMethod(String name, Class[] params) -- 應用特寫的參數類型,取得類聲明的定名的辦法

Method[] getDeclaredMethods() -- 取得類聲明的一切辦法

運用反射的根本步調:

1、取得你想操作的類的Class對象;

辦法一:Classc=Class.forName("java.lang.String") //這類方法取得類的Class對象須要 包名.類名

辦法二:關於根本數據類型可以用形如Class c=int.class或Class c=Integer.TYPE的語句

辦法三:Class c=MyClass.class

2、挪用Class中的辦法獲得你想獲得的信息聚集,如挪用getDeclaredFields()辦法獲得類的一切屬性;

3、處置第2步中獲得的信息,然落後行你想做的現實操作。

反射實例:

上面我將針對類的結構器、屬性和辦法分離舉三個例子,向年夜家演示一下反射的運用進程。

1、結構器

步調為:經由過程反射機制獲得某個類的結構器,然後挪用該結構器創立該類的一個實例

import java.lang.reflect.*; 
public class ConstructorDemo{ 
  public ConstructorDemo(){ } 
  public ConstructorDemo(int a, int b){ 
   System.out.println("a="+a+"b="+b); 
  } 
  public static void main(String args[]){ 
    try { 
      Class cls =Class.forName("包名.ConstructorDemo"); 
      Class partypes[] =new Class[2]; partypes[0] = Integer.TYPE;  
      partypes[1] =Integer.TYPE; 
      Constructor ct=cls.getConstructor(partypes); 
      Object arglist[] =new Object[2]; 
      arglist[0] = newInteger(37); 
      arglist[1] = newInteger(47); 
      Object retobj = ct.newInstance(arglist); 
     } catch (Throwable e) {
      System.err.println(e);} 
     } 
  } 

2、屬性

步調為:經由過程反射機制獲得某個類的某個屬性,然後轉變對應於這個類的某個實例的該屬性值

import java.lang.reflect.*; 
public class FieldDemo1{ 
 public double d; 
 public static void main(String args[]){ 
 try { 
  Class cls = Class.forName("FieldDemo1"); 
  Field fld = cls.getField("d"); 
  FieldDemo1 fobj = new FieldDemo1(); 
  System.out.println("d = " + fobj.d); 
  fld.setDouble(fobj, 12.34); 
  System.out.println("d = " + fobj.d); 
 } catch (Throwable e){ 
  System.err.println(e); } 
 } 
} 

3、辦法

步調為:經由過程反射機制獲得某個類的某個辦法,然後挪用對應於這個類的某個實例的該辦法

//經由過程應用辦法的名字挪用辦法 
import java.lang.reflect.*; 
public class MethodDemo1{ 
 public int add(int a, int b){ 
 return a + b; 
 } 
 public static void main(String args[]){ 
  try { 
   Class cls =Class.forName("MethodDemo1"); 
   Class partypes[] = new Class[2]; 
   partypes[0] = Integer.TYPE; 
   partypes[1] = Integer.TYPE; 
   Method meth = cls.getMethod("add",partypes); 
   MethodDemo1 methobj = new MethodDemo1(); 
   Object arglist[] = new Object[2]; 
   arglist[0] = new Integer(37); 
   arglist[1] = new Integer(47); 
   Object retobj= meth.invoke(methobj, arglist); 
   Integer retval = (Integer)retobj; 
   System.out.println(retval.intValue()); 
  } catch (Throwable e) { 
   System.err.println(e); 
  } 
 } 
}

3、java反射的運用(Hibernate)

我們在第二部門中對java反射停止了比擬體系的論述,也舉了幾個簡略的實例,上面我們就來評論辯論一下java反射的詳細運用。後面我們曾經知 道,Java反射機制供給了一種靜態鏈接法式組件的多功效辦法,它許可法式創立和掌握任何類的對象(依據平安性限制)之前,無需提早硬編碼目的類。這些特 性使得反射特殊實用於創立以異常通俗的方法與對象協作的庫。例如,反射常常在連續存儲對象為數據庫、XML或其它內部格局的框架中應用。上面我們就已 Hibernate框架為例像年夜家論述一下反射的主要意義。

Hibernate是一個屏障了JDBC,完成了ORM的java框架,應用該框架我們可以擯棄失落繁瑣的sql語句而是應用Hibernate中 Session類的save()辦法直接將某個類的對象存到數據庫中,也就是所觸及到sql語句的那些代碼Hibernate幫我們做了。這時候候就湧現了 一個成績,Hibernate如何曉得他要存的某個對象都有甚麼屬性呢?這些屬性都是甚麼類型呢?如斯,它在向數據庫中存儲該對象屬性時的sql語句該怎樣結構呢?處理這個成績的利器就是我們的java反射!

上面我們以一個例子來停止論述,好比我們界說了一個User類,這個User類中有20個屬性和這些屬性的get和set辦法,響應的在數據庫中 有一個User表,這個User表中對應著20個字段。假定我們從User表中提取了一筆記錄,如今須要將這筆記錄的20個字段的內容分離賦給一個 User對象myUser的20個屬性,而Hibernate框架在編譯的時刻其實不曉得這個User類,他沒法直接挪用myUser.getXXX或許 myUser.setXXX辦法,此時就用到了反射,詳細處置進程以下:

1、依據查詢前提結構PreparedStament語句,該語句前往20個字段的值;

2、Hibernate經由過程讀取設置裝備擺設文件獲得User類的屬性列表list(是一個String數組)和這些屬性的類型;

3、創立myUser所屬類的Class對象c;c=myUser.getClass();

4、結構一個for輪回,輪回的次數為list列表的長度;

4.1、讀取list[i]的值,然後結構對應當屬性的set辦法;

4.2、斷定list[i]的類型XXX,挪用PreparedStament語句中的getXXX(i),進而獲得i出字段的值;

4.3、將4.2中獲得的值作為4.1中獲得的set辦法的參數,如許就完成了一個字段像一個屬性的賦值,如斯輪回便可;

看到了吧,這就是反射的功績,假如沒有反射很難想象假如完成異樣的功效會有何等難!然則反射也出缺點,好比機能比擬低、平安性比擬龐雜等,這裡就不在評論辯論這些器械,感興致的讀者可以在網上找到謎底,有許多的!

願望本文所述對年夜家Java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved