先上一个基本的封装:

 /**
* 获取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;
}
}

路漫漫其修远兮!!!

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

Java_通过反射调用类中的方法的更多相关文章

  1. C# 利用反射调用类下的方法

    namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...

  2. C#如何通过反射调用类下的方法

    首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...

  3. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  4. C#通过反射获取类中的方法和参数个数,反射调用方法带参数

    using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...

  5. C#反射调用类的私有方法

    void Main() { var type = typeof(StockClass); type.Dump(); var fields=type.GetFields(BindingFlags.Ins ...

  6. Java反射机制demo(五)—获得并调用一个类中的方法

    Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...

  7. java 27 - 6 反射之 通过配置文件运行类中的方法

    在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: public class Dog { public void eat() { S ...

  8. jsp中怎么调用java类中的方法

    在jsp页面中先要,引入java类 例如: <%@page import="javabean.DbConn"%><!-- 引入包中的"类" - ...

  9. python: 面向对象:类和对象调用类中的变量和方法

    一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...

随机推荐

  1. tyvj1172 自然数拆分Lunatic版

    背景 话说小小鱼看了P1171(自然数拆分)之后感觉异常不爽,于是异常邪恶地将题目加强. 描述 输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复. 输入格式 输入只有一个整数n ...

  2. UIScrollView的常见属性

    @property(nonatomic) CGPoint contentOffset; 这个属性用来表示UIScrollView滚动的位置 (其实就是内容左上角与scrollView左上角的间距值) ...

  3. PHP的大括号(花括号{})使用详解

    一.不管什么程序,function name(){}, for(){}, ….这太多了,不说也知道什么用了. 二.$str{4}在字符串的变量的后面跟上{}大括号和中括号[]一样都是把某个字符串变量当 ...

  4. JS中的call()和apply()方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  5. linux下 chown命令

    对Document/ 目录下的所有文件与子目录执行相同的所有者变更,修改所有者为users用户组的username用户 chown -R username:users Document/ userna ...

  6. discuz上传图片提示附件文件无法保存

    两个可能: 1. 服务器文件夹权限不足 discuz附件保存在./data/attachments下,data文件夹的属性要求必须为777 #cd到data的上一级目录然后执行: data 2. 附件 ...

  7. Oracle分析函数(一)

    一.总体介绍 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 < ...

  8. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

  9. JVM内存管理------垃圾搜集器参数精解

    本文是GC相关的最后一篇,这次LZ只是罗列一下hotspot JVM中垃圾搜集器相关的重点参数,以及各个参数的解释.废话不多说,这就开始. 垃圾搜集器文章传送门 JVM内存管理------JAVA语言 ...

  10. 【安装MongoDB】CentOS7 下安装NodeJs+Express+MongoDB+Redis

    MongoDB,V3.2版本,官网说的很详细,见链接:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.创建 ...