zoukankan      html  css  js  c++  java
  • Java_通过反射调用类中的方法

    先上一个基本的封装:

     /**
         * 获取classType
         *
         * @param type
         * @param provinceCode
         * @param cityCode
         * @return
         * @throws Exception
         */
        public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception {
            Class<?> classType = Class.forName("com.lkb.sb." + type + "." + provinceCode + "." + cityCode + suffix);
            return classType;
        }
    
        /**
         * 获取base
         *
         * @param className
         * @return
         * @throws Exception
         */
        public Class<?> getClassType(String className) throws Exception {
            Class<?> classType = Class.forName(className);
            return classType;
        }
    
        /**
         * @param classType
         * @return
         * @throws Exception
         */
        public Object getClassInstance(Class<?> classType) throws Exception {
            return getClassInstance(classType, null, null);
        }
    
        /**
         * 获取对象client
         *
         * @param classType
         * @param classes
         * @param objects
         * @return
         * @throws Exception
         */
        public Object getClassInstance(Class<?> classType, Class[] classes, Object[] objects) throws Exception {
            Object client = classType.getConstructor(classes).newInstance(objects);
            return client;
        }
    
        /**
         * 执行不带参数的方法
         *
         * @param classType
         * @param instance
         * @param method
         * @return
         * @throws Exception
         */
        public Object implementMethod(Class<?> classType, Object instance, String method) throws Exception {
            return implementMethod(classType, instance, method, null, null);
        }
    
        /**
         * 执行方法
         *
         * @param classType
         * @param instance
         * @param method
         * @param paramTypes
         * @param params
         * @return
         * @throws Exception
         */
        public Object implementMethod(Class<?> classType, Object instance, String method, Class[] paramTypes, Object[] params) throws Exception {
            Method getStrMethod;
            Object result;
            if (paramTypes == null) {
                getStrMethod = classType.getMethod(method);
                result = getStrMethod.invoke(instance);
            } else {
                getStrMethod = classType.getMethod(method, paramTypes);
                result = getStrMethod.invoke(instance, params);
            }
            return result;
        }

    进一步封装,通过实现接口的形式调用,这样就省略了每次反射方法时还要写上参数类型数组:

    package com.lkb.autoCode.util;
    
    import com.lkb.autoCode.constant.AutoCodeConstant;
    
    import java.lang.reflect.Method;
    
    /**
     * DefultClassLoader 默认的类加载器
     *
     * @author Lilin
     * @date 2016/5/24
     */
    public class DefultClassLoader<T> {
    
        private Class<?> classType = null;
        private T reflectClass = null;
    
        /**
         * @param fullClassName 全包路径
         * @throws Exception
         */
        public DefultClassLoader(String fullClassName) throws Exception {
            classType = getClassType(fullClassName);
        }
    
        /**
         * @param type         模板类型
         * @param provinceCode 省Id
         * @param cityCode     市Id
         * @param className    类名称
         * @throws Exception
         */
        public DefultClassLoader(String type, String provinceCode, String cityCode, String className) throws Exception {
            classType = getClassType(type, provinceCode, cityCode, className);
        }
    
    
        /**
         * 获取classType
         *
         * @param type
         * @param provinceCode
         * @param cityCode
         * @return
         * @throws Exception
         */
        public Class<?> getClassType(String type, String provinceCode, String cityCode, String suffix) throws Exception {
            Class<?> classType = Class.forName(AutoCodeConstant.BASE_SB_PACKAGE + "." + type + "." + provinceCode + "." + cityCode + suffix);
            return classType;
        }
    
        /**
         * 获取base
         *
         * @param fullClassName
         * @return
         * @throws Exception
         */
        public Class<?> getClassType(String fullClassName) throws Exception {
            Class<?> classType = Class.forName(fullClassName);
            return classType;
        }
    
        /**
         * 获取对象client
         * @return
         * @throws Exception
         */
        public T getClassInstance() throws Exception {
            return getClassInstance(null, null);
        }
    
        /**
         * 获取对象client
         *
         * @param classes
         * @param objects
         * @return
         * @throws Exception
         */
        public T getClassInstance(Class[] classes, Object[] objects) throws Exception {
            T client = (T) classType.getConstructor(classes).newInstance(objects);
            return client;
        }
    
        /**
         * 执行不带参数的方法(忽略)
         *
         * @param classType
         * @param instance
         * @param method
         * @return
         * @throws Exception
         */
        public Object implementMethod(Class<?> classType, Object instance, String method) throws Exception {
            return implementMethod(classType, instance, method, null, null);
        }
    
        /**
         * 执行方法(忽略)
         *
         * @param classType
         * @param instance
         * @param method
         * @param paramTypes
         * @param params
         * @return
         * @throws Exception
         */
        public Object implementMethod(Class<?> classType, Object instance, String method, Class[] paramTypes, Object[] params) throws Exception {
            Method getStrMethod;
            Object result;
            if (paramTypes == null) {
                getStrMethod = classType.getMethod(method);
                result = getStrMethod.invoke(instance);
            } else {
                getStrMethod = classType.getMethod(method, paramTypes);
                result = getStrMethod.invoke(instance, params);
            }
            return result;
        }
    }

    路漫漫其修远兮!!!

    缺点:构造器的创建还得传递参数类型数组

  • 相关阅读:
    Entity Framework 指定架构无效 错误:1052
    发送邮件
    VS2013打开项目 提示Asp.net4.5未在web服务器上注册 F5运行 启动不来 权限
    转:10款中小企业必备的开源免费安全工具
    Jmeter JDBC Request的sql语句不支持;号
    Jmeter JDBC Request 中文乱码问题
    Jmeter JDBC Connection Configuration 链接失败,提示Error preloading the connection pool
    转:JDBC Request使用方法
    转:isualvm远程监控Tomcat
    转:AppScan代理扫描app/H5安全测试
  • 原文地址:https://www.cnblogs.com/gisblogs/p/5523676.html
Copyright © 2011-2022 走看看