JAVA 反射技術 萬用分頁標籤 核心代碼 (圖)
Java中,反射是一種強大的工具。它使您能夠創建靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代表鏈接。反射允許我們在編寫與執行時,使我們的程序代碼能夠接入裝載到JVM中的類的內部信息,而不是源代碼中選定的類協作的代碼。這使反射成爲構建靈活的應用的主要工具。但需注意的是:如果使用不當,反射的成本很高。
下面要介紹的例子是我從事struts開發時開發 萬用分頁標籤 所用到的技術,該標籤能根據傳入的bean list自動生成分頁表格
很多框架級應用中都必須用反射技術才能達到靈活泛用的目的,典型的struts,spring,hibernate等
下面我們就切入正題,看看反射技術是怎麼應用的
首先我們建立一個工程,名爲JavaReflect,再建立TestBean,TestMain,TabTest存入com.sdna.reflect包中
結構如下
如圖:1
==========TestBean 爲任意一個符合Bean命名規範的類
package com.sdna.reflect;
public class TestBean {
private int userID;
private String userName;
private String userSex;
private int userAge;
private String userAddr;
public TestBean() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
}
public void setUserID(int userID) {
this.userID = userID;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public void setUserAddr(String userAddr) {
this.userAddr = userAddr;
}
public int getUserID() {
return userID;
}
public String getUserName() {
return userName;
}
public String getUserSex() {
return userSex;
}
public int getUserAge() {
return userAge;
}
public String getUserAddr() {
return userAddr;
}
}
====================
==========TestMain 爲測試打印某實例所有方法,參數,返回值
package com.sdna.reflect;
import java.lang.reflect.*;
public class TestMain {
public TestMain() {
}
public static void main(String[] args) {
TestBean obj = new TestBean();
Class c = obj.getClass();
Method[] theMethods = c.getMethods();
for (int i = 0; i < theMethods.length; i++) {
String methodString = theMethods[i].getName();
System.out.println("Name: " + methodString);
String returnString =
theMethods[i].getReturnType().getName();
System.out.println(" Return Type: " + returnString);
Class[] parameterTypes = theMethods[i].getParameterTypes();
System.out.print(" Parameter Types:");
for (int k = 0; k < parameterTypes.length; k++) {
String parameterString = parameterTypes[k].getName();
System.out.print(" " + parameterString);
}
System.out.println("/n");
}
try {
theMethods[2].invoke(obj, "sky");
System.out.println(obj.getUserName());
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
}
====================
==========TabTest 爲讀任意一個符合Bean命名規範的實例
package com.sdna.reflect;
import java.lang.reflect.*;
public class TabTest {
public TabTest() {
}
public static void main(String[] args) {
TestBean obj = new TestBean();
obj.setUserID(10001);
obj.setUserName("sky");
obj.setUserSex("boy");
obj.setUserAge(23);
obj.setUserAddr("wuhan");
Class objClass = obj.getClass();
Field fields[] = objClass.getDeclaredFields();
// Method[] methods = objClass.getMethods();
Method tempMethod = null;
String strMethod = null;
for (int i = 0; i < fields.length; i++) {
try {
String fieldName = fields[i].getName();
Class typeClass = fields[i].getType();
String fieldType = typeClass.getName();
strMethod = fieldName;
strMethod = "get" +
strMethod.replaceFirst(strMethod.substring(0, 1),
strMethod.substring(0, 1).toUpperCase());
tempMethod = objClass.getMethod(strMethod);
System.out.println("Name: " + fieldName + ", Type: "
+ fieldType + ", Values: " + tempMethod.invoke(obj));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
====================
TestMain運行結果
如圖:2
TabTest運行結果
如圖:2
下面要介紹的例子是我從事struts開發時開發 萬用分頁標籤 所用到的技術,該標籤能根據傳入的bean list自動生成分頁表格
很多框架級應用中都必須用反射技術才能達到靈活泛用的目的,典型的struts,spring,hibernate等
下面我們就切入正題,看看反射技術是怎麼應用的
首先我們建立一個工程,名爲JavaReflect,再建立TestBean,TestMain,TabTest存入com.sdna.reflect包中
結構如下
如圖:1
==========TestBean 爲任意一個符合Bean命名規範的類
package com.sdna.reflect;
public class TestBean {
private int userID;
private String userName;
private String userSex;
private int userAge;
private String userAddr;
public TestBean() {
try {
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
}
public void setUserID(int userID) {
this.userID = userID;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public void setUserAddr(String userAddr) {
this.userAddr = userAddr;
}
public int getUserID() {
return userID;
}
public String getUserName() {
return userName;
}
public String getUserSex() {
return userSex;
}
public int getUserAge() {
return userAge;
}
public String getUserAddr() {
return userAddr;
}
}
====================
==========TestMain 爲測試打印某實例所有方法,參數,返回值
package com.sdna.reflect;
import java.lang.reflect.*;
public class TestMain {
public TestMain() {
}
public static void main(String[] args) {
TestBean obj = new TestBean();
Class c = obj.getClass();
Method[] theMethods = c.getMethods();
for (int i = 0; i < theMethods.length; i++) {
String methodString = theMethods[i].getName();
System.out.println("Name: " + methodString);
String returnString =
theMethods[i].getReturnType().getName();
System.out.println(" Return Type: " + returnString);
Class[] parameterTypes = theMethods[i].getParameterTypes();
System.out.print(" Parameter Types:");
for (int k = 0; k < parameterTypes.length; k++) {
String parameterString = parameterTypes[k].getName();
System.out.print(" " + parameterString);
}
System.out.println("/n");
}
try {
theMethods[2].invoke(obj, "sky");
System.out.println(obj.getUserName());
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
}
====================
==========TabTest 爲讀任意一個符合Bean命名規範的實例
package com.sdna.reflect;
import java.lang.reflect.*;
public class TabTest {
public TabTest() {
}
public static void main(String[] args) {
TestBean obj = new TestBean();
obj.setUserID(10001);
obj.setUserName("sky");
obj.setUserSex("boy");
obj.setUserAge(23);
obj.setUserAddr("wuhan");
Class objClass = obj.getClass();
Field fields[] = objClass.getDeclaredFields();
// Method[] methods = objClass.getMethods();
Method tempMethod = null;
String strMethod = null;
for (int i = 0; i < fields.length; i++) {
try {
String fieldName = fields[i].getName();
Class typeClass = fields[i].getType();
String fieldType = typeClass.getName();
strMethod = fieldName;
strMethod = "get" +
strMethod.replaceFirst(strMethod.substring(0, 1),
strMethod.substring(0, 1).toUpperCase());
tempMethod = objClass.getMethod(strMethod);
System.out.println("Name: " + fieldName + ", Type: "
+ fieldType + ", Values: " + tempMethod.invoke(obj));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
====================
TestMain運行結果
如圖:2
TabTest運行結果
如圖:2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.