先上一个基本的封装:

 /**
* 获取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. UITableView的添加、删除、移动操作

    #pragma mark -----表视图的移动操作----- //移动的第一步也是需要将表视图的编辑状态打开 //2.指定哪些行可以进行移动 - (BOOL)tableView:(UITableVi ...

  2. JMS开发步骤和持久化/非持久化Topic消息

    ------------------------------------------------ 开发一个JMS的基本步骤如下: 1.创建一个JMS connection factory 2.通过co ...

  3. java中的等于

    数字的比较等于用“==” 不等于用“!=” 字符的比较等于用“.equals”不等于用”!s1.equals(s2)“

  4. Javascript的动态增加‘类’的方法

    1.我们可以为每一个实例对象增加方法.也就是说我们在每次使用‘类’之外的方法时候,都需要创建一次. function Dog(){ window.alert('I  am a dog!'); } va ...

  5. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  6. [BZOJ2391]Cirno的忧郁

    [BZOJ2391]Cirno的忧郁 试题描述 Cirno闲着无事的时候喜欢冰冻青蛙. Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有 ...

  7. 【JSOI2007】麻将 bzoj 1028

    Description 麻 将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数牌(分为条子.饼子.万子三种花色,每种花色各有一到 九的九种牌),每种牌各四张 ...

  8. 交叉编译fftw

    交叉编译 fftw 使用的源码是 fftw-3.2.2-arm.tar.gz 新塘平台arm ./configure --prefix=/usr/local/fftw_arm --host=arm-l ...

  9. [转]MyEclipse 里查看jar文件源码

    在开发过程中,有时候需要查看jar文件的源码,这里讲解如何设置.  选中某一个jar文件,如我这里选中的是struts2-core-2.1.6.jar,然后右键-->Properties--&g ...

  10. C# Mvc中文件下载

    public ActionResult DownloadFile(string id) { var fileinfo = CommonAnnexService.Get(id); if (fileinf ...