JAVA 反射技术 万用分页标签 核心代码 (图)

来源:互联网 发布:灾难片知乎 编辑:程序博客网 时间:2024/05/03 15:49
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
 
原创粉丝点击