`

Java反射调用带参数的函数

 
阅读更多

目前本文中只考虑函数参数为基本类型、包装类型、String类型。其他负责类型,以后再慢慢补充。代码如下:

 

package com.zkn.newlearn.reflect;

import java.io.Serializable;

/**
 * Created by zkn on 2016/5/9.
 */
public class ReflectTest02 implements Serializable{

    public void testVariableArgument(String str,char str1){
        System.out.println(str + "   "+str1);
    }
}

 

package com.zkn.newlearn.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 参数类型为基本类型、包装类型、String类型
 * 重载方法暂时没有考虑
 * 更复杂类型参数以后会补充进来
 * Created by zkn on 2016/5/9.
 */
public class ReflectTest03 {

    public static void main(String[] args){
    	List<Object> list = new ArrayList<Object>();
    	list.add("张三");
    	list.add("C");
    	//全部当做String值来传递
        executeReflectMethod("com.zkn.newlearn.reflect.ReflectTest02","testVariableArgument",list);
    }

	private static void executeReflectMethod(String className,String methodName,List<Object> list) {
		try {
            Object clazz = Class.forName(className).newInstance();
            Method[] obj = clazz.getClass().getMethods();
            for(Method method : obj){
                if(methodName!=null && methodName.equals(method.getName())){
                    //如果是private修饰符的,则把可访问性设置为true
                    if(!method.isAccessible()){
                        method.setAccessible(true);
                    }
                    //得到方法中的所有参数信息
                    Class<?>[] parameterClazz = method.getParameterTypes();
                    List<Object> listValue = new ArrayList<Object>();
                    //循环参数类型
                    for(int i=0; i<parameterClazz.length; i++){
                        fillList(listValue, parameterClazz[i],list.get(i));
                    }
                    method.invoke(clazz,listValue.toArray());
                }
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	private static void fillList(List<Object> list, Class<?> parameter,Object value) {
		System.out.println(parameter.getTypeName());
		if("java.lang.String".equals(parameter.getTypeName())){
			list.add(value);
		}else if("java.lang.Character".equals(parameter.getTypeName())){
			char[] ch = ((String)value).toCharArray();
			list.add(ch[0]);
		}else if("char".equals(parameter.getTypeName())){
			char[] ch = ((String)value).toCharArray();
			list.add(ch[0]);
		}else if("java.lang.Double".equals(parameter.getTypeName())){
			list.add(Double.parseDouble((String) value));
		}else if("double".equals(parameter.getTypeName())){
			list.add(Double.parseDouble((String) value));
		}else if("java.lang.Integer".equals(parameter.getTypeName())){
			list.add(Integer.parseInt((String) value));
		}else if("int".equals(parameter.getTypeName())){
			list.add(Integer.parseInt((String) value));
		}else if("java.lang.Long".equals(parameter.getTypeName())){
			list.add(Long.parseLong((String) value));
		}else if("long".equals(parameter.getTypeName())){
			list.add(Long.parseLong((String) value));
		}else if("java.lang.Float".equals(parameter.getTypeName())){
			list.add(Float.parseFloat((String) value));
		}else if("float".equals(parameter.getTypeName())){
			list.add(Float.parseFloat((String) value));
		}else if("java.lang.Short".equals(parameter.getTypeName())){
			list.add(Short.parseShort((String) value));
		}else if("shrot".equals(parameter.getTypeName())){
			list.add(Short.parseShort((String) value));
		}else if("java.lang.Byte".equals(parameter.getTypeName())){
			list.add(Byte.parseByte((String) value));
		}else if("byte".equals(parameter.getTypeName())){
			list.add(Byte.parseByte((String) value));
		}else if("java.lang.Boolean".equals(parameter.getTypeName())){
			if("false".equals(value) || "0".equals(value)){
				list.add(false);
			}else if("true".equals(value) || "1".equals(value)){
				list.add(true);
			}
		}else if("boolean".equals(parameter.getTypeName())){
			if("false".equals(value) || "0".equals(value)){
				list.add(false);
			}else if("true".equals(value) || "1".equals(value)){
				list.add(true);
			}
		}
	}
}



分享到:
评论

相关推荐

    利用java反射调用实现对字符串的解析,成功调入函数,并且返回值

    在这个场景中,我们关注的是如何利用Java反射调用来解析字符串并执行相关函数,最终获取返回值。下面将详细阐述这个过程。 首先,`ReflectUtils.java` 文件可能包含了一些静态方法,这些方法提供了反射操作的便利...

    spring与java反射结合动态定义类及调用函数

    spring与java反射结合动态定义类及调用函数,实现类的动态定义和函数的动态调用。 为有动态调用的web应用提供一点点借鉴,相互学习。

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    groovy和Java相互调用1

    2. **方法2:反射动态调用** - 使用Java的反射机制,可以在运行时动态加载和执行Groovy类。这种方法的优点是Groovy脚本的修改不需要重新编译整个项目,因为Java代码可以通过反射动态地找到并调用Groovy方法。这里,...

    通过反射调用静态方法

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。

    Java反射机制的动态调用计算器的加法,减法函数;修改一个学生对象的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在给定的场景中,我们利用反射机制实现了动态调用计算器的加法和减法函数,并修改了学生对象的...

    phoneGap与android的activity交互例子,互相调用函数,js,java的交互

    一个Android原生activity与phonegap交互的例子, java调用js,js调用java 工程中是一个嵌套了phonegap的activity ,外层是android的activity,内层framelayout中是phonegap,完成了交互的简单例子

    Java反射性能测试分析

    - 动态创建对象:通过反射调用构造函数创建对象比直接使用new关键字慢得多,尤其是在高迭代次数下。 - 设置字段值:通过反射设置字段值相比直接赋值也明显更慢,这是因为反射需要查找并解析字段描述符。 - 获取字段...

    java反射获取参数.zip

    这个“java反射获取参数.zip”文件很可能是关于如何利用Java反射获取类的属性、方法,特别是对于List集合类的操作。 首先,我们来详细解释Java反射的基本概念。在Java中,每个类都有一个Class对象,这个对象包含了...

    Java反射获取私有构造函数、属性、方法

    Java 反射机制获取私有构造函数的原理是通过获取类的 Constructor 对象,然后调用其 newInstance 方法来创建类的实例。例如,以下代码演示了如何获取私有构造函数: ```java Constructor[] cts = Class.forName(...

    反射实例-JAVA反射机制

    在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...

    java动态调用方法

    Java动态调用方法是Java反射机制的一个重要应用,它允许我们在程序运行时,根据需要动态地获取类的信息并调用其方法。这种能力为代码的灵活性和可扩展性提供了强大的支持,尤其在处理不确定的对象类型或者需要在运行...

    用反射解析jar文件并执行里面Java代码

    在上述代码中,我们假设`YourMainClass`有一个无参数的公共构造函数,并且该类有一个`main`方法,符合Java应用的标准入口点。 然而,为了确保安全性和避免恶意代码的执行,你需要在执行代码前进行充分的验证。例如...

    JNI反射调用Java方法1

    在本场景中,我们讨论的是如何通过JNI使用反射调用Java方法。反射在Java中是一个强大的工具,允许程序在运行时动态地访问和修改类、接口、字段和方法。以下是对标题和描述中所述知识点的详细解释: 1. **找类字节码...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    Java反射函数机制实现List转换Json

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括获取类的信息、创建对象、调用方法以及访问和...

    java反射深入剖析(推荐)

    案例4则演示了如何通过反射调用类的构造函数。为了创建对象并指定构造参数,可以使用`Constructor`类。首先,我们需要获取目标构造器,通过`Class.getConstructor()`或`Class.getConstructors()`方法,然后调用`...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

Global site tag (gtag.js) - Google Analytics