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: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
随机推荐
- C语言基础(7)-float,double,long double类型
1.定义方式 3.14这个就是一个浮点常量,3f是一个浮点类型的常量 float a;//定义了一个浮点类型的小数变量,名字叫a double b;//定义了一个double类型的变量,名字叫b lo ...
- C语言基础(3)-二进制、八进制、十六进制
1.二进制 一个位只能表示0或者1两种状态,简称bit(比特) 一个字节为8个二进制数,称为8位,简称BYTE(字节) 一个字为2个字节,简称WORD. 两个字为双字,简称DWORD,占32个bit ...
- socket编程热身程序
/*server.c*/ #include <stdio.h> #include <arpa/inet.h> #include <sys/types.h> /* S ...
- CentOS6.3编译安装Nginx1.4.7 + MySQL5.5.25a + PHP5.3.28
[准备工作] #在编译安装lnmp之前,首先先卸载已存在的rpm包. rpm -e httpd rpm -e mysql rpm -e php yum -y remove httpd yum -y r ...
- mysql连接超时与jndi数据源配置
昨天有运营说添加活动不能用了,我就看了一下后台日志,发现访问数据库是报错: at java.lang.Thread.run(Thread.java:722) Caused by: com.mysql. ...
- linux git安装及配置(包括更新)
1.在终端运行命令 sudo apt-get install git 2.查看版本号 git --version (若不是最新可更新 自选) 更新提示: sudo add-apt-repositor ...
- gulp基本介绍
一.gulp是什么 gulp就是用来机械化的完成重复性质(如less->css:js.css压缩:js混淆)的工作:gulp的机制就是将重复工作抽象成一个个的任务. 二.gulp使用 a.首先确 ...
- HTML:让表单、文本框只读,不可编辑的方法
有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...
- 单位圆盘的全纯自同构群Aut B(0,1)
利用Schwarz引理可以求出单位圆盘$B(0,1)$的全纯自同构群${\rm Aut}B(0,1)$. 任取$a\in B(0,1)$,记$$\varphi_{a}(z)=\frac{a-z}{1- ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...