我是靠谱客的博主 清新羊,最近开发中收集的这篇文章主要介绍java 动态类名_Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

packageutil;importjava.lang.reflect.Method;importjava.net.URLClassLoader;importjava.util.Arrays;importjava.util.HashMap;importjava.util.Map;//动态执行方法,但是不能调用方法的方法//getparam_valueandetype():解析参数,分解为参数值和参数类型数组//runMethod_classname():传递类名,自动实例化执行方法//runMethod_classinstance():传递类实例,执行方法

public classEeflect {publicClass getClass(String classname) {//URLClassLoader classloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

Class c = null;try{

c=Class.forName(classname);//c = classloader.loadClass(classname);

} catch(Exception e) {

e.printStackTrace();

}returnc;

}public Map getparam_valueandetype(String params) {//入参字符串,将其解析为参数class类型数组和参数值数组//params使用英文逗号隔开,使用:分隔参数类型和值,例如abcd,int 1,test,int:2,StringArrays:1、2、3

Object[] paramlist = new Object[]{};//存储变量值

Class[] classtype = new Class[]{};//存储变量类型

Map result= newHashMap();if (!params.equals("")) {//传递了参数params走这里

String[] paramslist_temp = params.split(",|,");int num =paramslist_temp.length;

paramlist= newObject[num];

classtype= newClass[num];for (int i = 0; i < num; i++) {

String[] param_type_value= paramslist_temp[i].toString().split(":");//判断参数是否有类型定义

if (param_type_value.length > 1) {

String param_type= param_type_value[0];

String param_value= param_type_value[1];if (param_type.equalsIgnoreCase("int")) {//System.out.println("value=" + param_value);

paramlist[i] =Integer.parseInt(param_value);

classtype[i]= int.class;

}else if (param_type.equalsIgnoreCase("string")) {

paramlist[i]=param_value;

}else if (param_type.equalsIgnoreCase("stringarrays")) {

paramlist[i]= param_value.split("、");

classtype[i]= String[].class;

}else{

System.out.println("变量类型不支持,目前只支持int强转,当前变量的类型为:" +param_type);returnresult;

}

}else{

paramlist[i]=paramslist_temp[i];

classtype[i]=paramslist_temp[i].getClass();

}

}

}

result.put("paramlist", paramlist);

result.put("classtype", classtype);returnresult;

}public boolean runMethod_classname(String classname, String methodname, String params) {//传递classname字符串,执行方法

boolean result = false;

Map paraminfo= this.getparam_valueandetype(params);if (paraminfo == null) {returnresult;

}

Object[] paramlist= (Object[]) paraminfo.get("paramlist");

Class[] classtype= (Class[]) paraminfo.get("classtype");

result=this.runMethod(classname, methodname, paramlist, classtype);returnresult;

}public boolean runMethod(String classname, String methodname, Object[] params, Class[] paramstype) {//通过类名获得类实例,去执行方法

boolean result = false;try{

Class c= this.getClass(classname);if (c != null) {

Object o=c.newInstance();

Method m=c.getMethod(methodname, paramstype);

m.invoke(o, params);

result= true;

}

}catch(Exception e) {

e.printStackTrace();

}returnresult;

}public boolean runMethod_classinstance(Object classinstance, String methodname, String params) {//传递class实例,执行方法

boolean result = false;

Map paraminfo= this.getparam_valueandetype(params);

Object[] paramlist= newObject[]{};

Class[] classtype= newClass[]{};if (paraminfo != null) {

paramlist= (Object[]) paraminfo.get("paramlist");

classtype= (Class[]) paraminfo.get("classtype");

}

result= this.runMethod_hasclass(classinstance, methodname, paramlist, classtype);//if(!result){//System.out.println("runMethod_classinstance失败了");//}

returnresult;

}public boolean runMethod_hasclass(Object classinstance, String methodname, Object[] params, Class[] paramstype) {//通过类实例,去执行它的方法

boolean result = false;try{

Class c=classinstance.getClass();

Method m=c.getMethod(methodname, paramstype);

m.invoke(classinstance, params);

result= true;

}catch(Exception e) {

e.printStackTrace();

}returnresult;

}public booleanrunMethod(String classname, String methodname, Object[] params) {boolean result = false;try{

Class paramlist[]= null;if (params != null) {// int len =params.length;

paramlist= newClass[len];for (int i = 0; i < len; ++i) {

paramlist[i]=params[i].getClass();if (paramlist[i].toString().equals("class java.lang.Integer")) {

paramlist[i]= int.class;

}

}

}

Class c= this.getClass(classname);if (c != null) {

Object o=c.newInstance();

Method m=c.getMethod(methodname, paramlist);

m.invoke(o, params);

result= true;

}

}catch(Exception e) {

e.printStackTrace();

}returnresult;

}

}

最后

以上就是清新羊为你收集整理的java 动态类名_Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)...的全部内容,希望文章能够帮你解决java 动态类名_Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部