`
renjie120
  • 浏览: 237679 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D11bba82-ec4a-3d31-a3c0-c51130c62f1c
Java应用集锦
浏览量:22905
社区版块
存档分类
最新评论

java应用集锦2:反射

    博客分类:
  • java
阅读更多

在项目中多处使用到反射方法,jdk为1.5.现总结如下:

1.设置java对象的指定属性为指定值,调用set方法:

  /**
         * 使用反射机制进行设置值.
         * @param o 对象
         * @param name 要设置的属性
         * @param value 要设置的value
         */
        public static void setPro(Object o, String name, String value) {
                PropertyDescriptor[] props;
                try {
                        props = Introspector.getBeanInfo(o.getClass(), Object.class)
                                        .getPropertyDescriptors();
                        for (int temp = 0; temp < props.length; temp++) {
                                if (name.equals(props[temp].getName())) {
                                        try {
                                                props[temp].getWriteMethod().invoke(o, value);
                                        } catch (Exception e) {
                                        }
                                        break;
                                }
                        }
                } catch (IntrospectionException e1) {
                        e1.printStackTrace();
                }
        }

 2.得到java bean里面的属性值

/**
         * 得到指定对象的指定属性值.
         * @param o 对象
         * @param name 属性名
         * @return
         */
        public static String getPro(Object o, String name) {
                String result = "";
                PropertyDescriptor[] props;
                try {
                        props = Introspector.getBeanInfo(o.getClass(), Object.class)
                                        .getPropertyDescriptors();
                        for (int temp = 0; temp < props.length; temp++) {
                                if (name.equals(props[temp].getName())) {
                                        try {
                                                result = props[temp].getReadMethod().invoke(o)
                                                                .toString();
                                        } catch (Exception e) {
                                        }
                                        break;
                                }
                        }
                        return result;
                } catch (IntrospectionException e1) {
                        e1.printStackTrace();
                        return null;
                }
        }

 3.打印一个java bean里面的全部的get方法:

  public static void getAllGets(Object o) {
                Method[] method = o.getClass().getMethods();
                try {
                        for (int i = 0; i < method.length; i++) {
                                //如果方法名是含有get的名称,而且是返回的string类型,以及参数个数为空,就调用该方法。
                                if (method[i].getName().indexOf("get") != -1
                                                && method[i].getGenericReturnType().toString().indexOf(
                                                                "String") != -1
                                                && method[i].getGenericParameterTypes().length == 0) {
                                        System.out.println(i + method[i].getName() + "():\n"
                                                        + method[i].invoke(o, null));
                                }
                        }
                } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        e.printStackTrace();
                } catch (InvocationTargetException e) {
                        e.printStackTrace();
                }
        }

 4.得到一个对象里面全部返回值为string类型的方法:

 /**
         * 得到一个对象的返回string的全部方法.
         * @param o
         */
        public static List<String> getAllMethods(Object o) {
                Method[] method = o.getClass().getMethods();
                List<String> methods = new ArrayList();
                try {
                        for (int i = 0; i < method.length; i++) {
                                //如果方法名是含有get的名称,而且是返回的string类型,以及参数个数为空,就调用该方法。
                                if ( method[i].getGenericReturnType().toString().indexOf(
                                                                "String") != -1
                                                && method[i].getGenericParameterTypes().length == 0) {
                                        methods.add(method[i].getName());
                                }
                        }
                } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                }
                return methods;
        }

 5.得到一个对象的全部属性

 /**
         * 得到一个对象的全部属性值.
         * @param o
         * @return 属性名和属性值的映射
         */
        public static Map getAllProperties(Object o) {
                Map ans = new HashMap();
                PropertyDescriptor[] props;
                try {
                        props = Introspector.getBeanInfo(o.getClass(), Object.class)
                                        .getPropertyDescriptors();
                        for (int temp = 0; temp < props.length; temp++) {
                                        String result = null;
                                        if(props[temp].getReadMethod().invoke(o)!=null)
                                                result = props[temp].getReadMethod().invoke(o).toString();
                                        ans.put(props[temp].getName(), result);
                        }
                } catch (Exception e1) {
                        e1.printStackTrace();
                }
                return ans;
        }

 6.返回对象中设置了get方法的属性的集合

 /**
         * 返回对象中设置了get方法的属性的集合,注意集合的成员是Field对象!
         * @param obj
         * @return
         */
        public static List<Field> allAttrWithGetMethod(Object obj) {
                Field[] fields = obj.getClass().getDeclaredFields();
                Method[] methods = obj.getClass().getMethods();
                List result = new ArrayList();
                for (Field field : fields) {
                        String fieldName = field.getName();
                        String upperFirstLetter = fieldName.substring(0, 1).toUpperCase();
                        String getMethodName = "get" + upperFirstLetter
                                        + fieldName.substring(1);
                        for (Method method : methods) {
                                if (Util.equals(getMethodName, method.getName())) {
                                        result.add(field);
                                }
                        }
                }
                return result;
        }

 7.执行指定对象的无参方法:

  /**
         * 使用反射执行指定对象的无参方法,返回结果是一个对象.
         * @param obj 对象
         * @param methodName 方法名
         * @return
         * @throws MVCException 
         */
        public static Object invoke(Object obj, String methodName) throws Exception,MVCException {
                try {
                        //如果没有配置method参数就默认的使用execute()方法。                        
                        if(Util.isEmpty(methodName))
                                methodName = "execute";
                        if(!getAllMethods(obj).contains(methodName)){
                                throw new MVCException(obj.getClass().getName()+"反射执行方法中没有找到与"+methodName+"匹配的方法,或者没有execute方法!");
                        }
                        Method method = obj.getClass().getMethod(methodName, null);
                        return method.invoke(obj, null);
                } 
                catch (MVCException e) {
                        throw e;
                }
                catch (Exception e) {
                        throw e;
                }
        }

 8.执行有参的私有方法:

/**
     * 调用指定对象的私有方法
     * @param object
     * @param methodName
     * @param params
     * @return
     * @throws NoSuchMethodException
     */
    public static Object invokePrivateMethod(Object object, String methodName,
            Object... params) throws NoSuchMethodException {
        Assert.notNull(object);
        Assert.hasText(methodName);
        //得到参数数组的类型,后面将根据这个查找指定的方法对象.
        Class[] types = new Class[params.length];
        for (int i = 0; i < params.length; i++) {
            types[i] = params[i].getClass();
        }

        Class clazz = object.getClass();
        Method method = null;
        //向上转型一直找到基类里面的方法.
        for (Class superClass = clazz; superClass != Object.class; superClass = superClass
                .getSuperclass()) {
            try {
                    //两个参数表示:方法名,方法中的参数数组.
                    //返回方法对象.
                method = superClass.getDeclaredMethod(methodName, types);
                break;
            } catch (NoSuchMethodException e) {
            }
        }
        if (method == null)
            throw new NoSuchMethodException(clazz.getSimpleName()+" No Such Method:"
                    + methodName);
        //先保存以前的可访问性
        boolean accessible = method.isAccessible();
        method.setAccessible(true);
        Object result = null;
        try {
            result = method.invoke(object, params);
        } catch (Exception e) {
            ReflectionUtils.handleReflectionException(e);
        }
        method.setAccessible(accessible);
        return result;
    }

 9.BeanUtils工具类

import org.apache.commons.beanutils.BeanUtils;

public static void main(String[] args){
                Chart s = new Chart();
                try {
                        Map m = BeanUtils.describe(s);
                        System.out.println(m.keySet());
                } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (NoSuchMethodException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

 

分享到:
评论

相关推荐

    Java编程精选集锦

    11. **Spring框架**:Spring是一个全面的后端开发框架,包含依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,简化了Java应用的开发。 12. **Java 8新特性**:Java 8引入了Lambda表达式、函数式编程...

    Java案例开发集锦(第二版)源代码

    12. **反射与注解**:反射是Java动态性的一大体现,注解则为代码提供了元数据,案例可能讲解了它们的使用方法和应用场景。 13. **网络编程**:通过Socket编程,案例可能展示了如何创建客户端和服务端通信的应用,...

    java技术文章集锦

    Java技术文章集锦是一个丰富的资源库,包含了大量关于Java编程的知识点,对于正在学习或已经从事Java开发的人员来说,这是一个宝贵的参考资料。这个压缩包文件中的每一篇文章都可能涵盖了一个或多个Java技术主题,让...

    java面试笔试题集锦

    6. **反射机制**:Java反射允许程序在运行时动态地获取类的信息并操作类的对象,是很多高级功能的基础,如动态代理、序列化等。 7. **JVM内存模型**:理解堆、栈、方法区、本地方法栈等区域的工作原理,以及垃圾...

    java笔试集锦大全

    Java笔试集锦大全是一个汇集了众多Java编程相关面试和笔试问题的资源,旨在帮助学习者和求职者深入了解Java语言的核心概念、技术细节以及常见问题的解决策略。这个压缩包中的"java笔试集锦大全.txt"文件很可能是包含...

    Java案例开发集锦第一版源代码

    "Java案例开发集锦第一版源代码"是一个集合,包含了多个Java编程的实际应用示例,旨在帮助开发者理解和掌握Java的核心概念和技术。这个压缩包很可能是为初学者或有经验的程序员设计的,提供了一个实践学习的资源库。...

    二级Java试题集锦

    9. **反射机制**:反射是Java的一个强大特性,允许程序在运行时动态地获取类的信息并操作类的对象。 10. **Java集合框架**:这包括List、Set、Map接口以及其实现类,考生需理解它们的特点和应用场景。 11. **泛型*...

    Java编程精选集锦(附源代码)

    Java编程精选集锦是一份全面且深入的Java学习资源,旨在帮助那些已经对Java有基本了解的开发者进一步提升他们的技能。这份集锦包含了各种实际应用中的编程实例,旨在通过实践来增强理论知识的理解。以下是对这份资料...

    2018年Java面试集锦

    Java作为全球最流行的编程语言之一,其在企业级应用中的地位不言而喻。随着技术的不断迭代,Java开发者需要持续学习和提升自己的技能以适应市场需求。2018年Java面试集锦正是这样一个资源,它包含了当年最新的面试...

    java笔试题经典集锦

    Java笔试题经典集锦是针对Java开发者准备的面试和学习资源,主要涵盖了各种典型的编程题目。这份资料旨在帮助应聘者和学习者深入理解Java语言的核心概念、语法特性以及实际问题的解决策略。以下是对这份集锦中可能...

    JAVA学习书籍_java案例开发集锦

    总之,《JAVA学习书籍_java案例开发集锦》是一本全面覆盖JAVA核心概念和实践技能的教材,适合想要深入理解和应用JAVA技术的读者。通过书中的实例,读者不仅可以学习理论知识,还能提升实际编程能力,为成为一名熟练...

    Java案例开发集锦

    《Java案例开发集锦》是一份宝贵的资源,涵盖了Java编程的多个重要方面,旨在帮助开发者深化理解、提高技能。这份集锦中包含了丰富的程序实例,是学习和实践Java技术的理想资料。下面,我们将深入探讨其中可能涉及的...

    中兴华为java面试集锦

    8. **反射机制**:了解如何在运行时动态获取类信息、创建对象和调用方法,以及反射在实际开发中的应用。 9. **JVM调优**:理解JVM参数设置,如堆大小、新生代和老年代比例、GC策略等,以及如何根据性能需求进行调整...

    Java入门面试题集锦:全面覆盖30道经典问题,助你准备顺利通过面试!

    Java是一种广泛应用的高级编程语言,由Sun Microsystems在1995年发布,其设计目标是实现跨平台的可移植性和高效性。Java以其面向对象的特性、简单的语法、丰富的类库以及内置的安全机制赢得了广大开发者青睐。以下是...

    java案例开发集锦

    这个"java案例开发集锦"很可能包含了多个Java编程的实际应用案例,旨在帮助学习者深入理解和掌握Java技术。以下是对Java编程的一些核心知识点的详细说明,这些知识点可能会在案例集中体现: 1. **基础语法**:Java...

    java面试题集锦 基础题 java工程师面试

    本压缩包文件“java面试题集锦”包含了多个文档,提供了丰富的Java面试题,旨在帮助求职者全方位提升自己的面试竞争力。 首先,Java基础题是每个面试者必须掌握的,这些题目通常涵盖以下几个方面: 1. **Java语法*...

    java性能优化集锦

    在Java开发过程中,性能优化是不可或缺的一环,它关乎到应用程序的运行效率、资源消耗以及用户体验。本资料集锦主要涵盖了Java性能...通过对这些知识点的学习和实践,开发者能够构建出更加高效、稳定的Java应用程序。

    java小程序集锦

    通过研究“Java小程序集锦”,开发者不仅能巩固基础,还能了解如何将Java的特性应用于实际问题中,提升编程技巧和解决问题的能力。这些小程序就像一个个微缩的实战项目,对于学习和教学Java语言都极具价值。

    java笔试题集锦

    Java笔试题集锦是针对Java编程语言的一系列面试和笔试问题的集合,旨在帮助学习者和求职者深入了解Java的核心概念、语法以及高级特性。这里,我们将深入探讨这些知识点,涵盖从基础到进阶的各个方面。 一、Java基础...

Global site tag (gtag.js) - Google Analytics