先上一个基本的封装:

 /**
* 获取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. ThinkPhP 分页

    <?php namespace User\Service; use Think\Controller; use Think\Exception; class UserService { // 每 ...

  2. Tomcat端口被占用错误

    所报错误: 严重: Error initializing endpointjava.lang.Exception: Socket bind failed: [730013] ????????????? ...

  3. easyui-textbox回车事件

    $('#id').textbox('textbox').keydown(function (e) { if (e.keyCode == 13) { alert('enter'); } });

  4. 子类可以有跟父类中同名的方法,但是会重写父类中的方法,甚至是root class中的方法

    /* 子类可以重写父类中的方法,甚至是root class中的方法,比如NSObeject 的new方法,但是后提示警告如下 Method is expected to return an insta ...

  5. 加载默认图片,如何避免img标签陷入onerror事件死循环

    当图片加载失败的时候,我们可以利用onerror事件赋予它默认图片,但是问题来了,假如默认图片又不存在呢,即加载失败,这个时候就会陷入死循环. 为了避免死循环的情况,我们可以在执行完onerror事件 ...

  6. POJ2914 (未解决)无向图最小割|Stoer-Wagner算法|模板

    还不是很懂,贴两篇学习的博客: http://www.hankcs.com/program/algorithm/poj-2914-minimum-cut.html http://blog.sina.c ...

  7. and or bool and a or b 原理解释

    python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值. or也是从左到有计算表达式,返回第一个为真的值. 代码如下: IDLE 1.2.4>&g ...

  8. Caffe学习系列(17): caffe源码分析 vector<Blob<Dtype>*>& bottom(转)

    转自:http://blog.csdn.net/qq_14975217/article/details/51524042 Blob:4个维度 n x c x h x w: bottom[0] .bot ...

  9. java环境配置为1.7jdk为什么cmd java -version查看版本是1.8

    记录一个小问题: 初始安装的是jdk1.8,后来项目需要要更换成jdk1.7, 因此将环境变量更改为jdk7的目录路径, 但是在cmd命令行运行java -version 发现还是jdk8 解决方法: ...

  10. OpenCV 2.4.13 编译使用(VS2015下)

    OpenCV2.4.13编译(VS2015) 这里给出已经编译好的的下载路径.包括Win64的debug和release版本. OpenCV for MSVC14 Win64 1.下载OpenCV源码 ...