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