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;
}
}
路漫漫其修远兮!!!
缺点:构造器的创建还得传递参数类型数组
Java_通过反射调用类中的方法的更多相关文章
- C# 利用反射调用类下的方法
namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...
- C#如何通过反射调用类下的方法
首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- C#通过反射获取类中的方法和参数个数,反射调用方法带参数
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...
- C#反射调用类的私有方法
void Main() { var type = typeof(StockClass); type.Dump(); var fields=type.GetFields(BindingFlags.Ins ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- java 27 - 6 反射之 通过配置文件运行类中的方法
在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: public class Dog { public void eat() { S ...
- jsp中怎么调用java类中的方法
在jsp页面中先要,引入java类 例如: <%@page import="javabean.DbConn"%><!-- 引入包中的"类" - ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
随机推荐
- eclipse中 linked resource的使用
一.关于linked resource eclipse 中的linkded resources 是指存放在项目所在位置以外某个地方的文件或者文件夹:这些特定的资源必须有一个项目作为他们的父资源.l ...
- 初探微信小程序
摘要 最近闲下来了,就准备了解下微信小程序的内容.首先从目录结构开始吧. 创建项目 工具下载:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/do ...
- @SuppressWarnings注解的用法
一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的"感叹号"就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @S ...
- openjdk 完全编译指南
从openjdk.java.net下载openjdk的软件包,你就获得了所有相关的源码. 强烈建议首先仔细看懂 README-builds.html 指南. 在执行 make all 之前,首先要 执 ...
- LYDSY模拟赛day1 Tourist Attractions
/* 假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计 算有多少可行的 a 和 d. 设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为 (degb − 1 ...
- Linux下提示 bash: xxx command not found
今天在虚拟机上安装了CentOS5.5,发现运行一些很正常的诸如:init,shutdown,fdisk 等命令时,悍然提示: bash: xxx command not found. 那么,首先就要 ...
- phpcms专题路径修改
两个文件改三处就可以了,既可以后台点击专题列表链接问题,也可以解决生成专题多一个“/”的问题. 1.\phpcms\modules\special\classes\html.class.php大概第1 ...
- MyEclispe发布web项目-遁地龙卷风
(-1)写在前面 我用的是MyEclipse8.5. 还记得以前帮助一个女同学解决问题的时候,特意情调了要先启动服务在发布项目,其实单独的时候都是知道的,总和起来后就容易片面的给出结论.因为不会发生问 ...
- zozoui
http://zozoui.com/tabs/?utm_source=cc_tabs&utm_medium=codecanyon&utm_campaign=Codecanyon+-+T ...
- 转:mysql根据经纬度查找排序
一.MySql不使用空间函数,简单版 1.粗算,根据场景得到一个range,计算经纬度,得到的是一个矩形区域(A),不精确,但是已经有范围这个雏形了,最容易实现的方式之一. 1 2 3 4 5 6 w ...