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法式設計有所贊助。