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