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反射机制允许程序在运行时动态地获取的信息以及操作的方法、属性和构造器。以下是关于如何通过反射机制调用方法的具体实现方式。 #### 动态加载并获取 `Class` 对象 要使用反射调用方法,首先需要获得目标的 `Class` 对象。可以通过以下三种方式之一完成此操作: 1. 使用 `Class.forName()` 方法传入完整的名字符串。 2. 调用某个对象的 `.getClass()` 方法。 3. 直接使用字面量 `SomeClass.class` 来获取其对应的 `Class` 对象[^1]。 #### 获取目标方法 一旦获得了 `Class` 对象,就可以通过它来查找特定的方法。可以使用两种主要方法来检索它们: - **公共方法**:对于公开(public)或者受保护(protected)的方法,可以直接使用 `getMethod(name, parameterTypes)` 函数找到匹配签名的方法[^2]。 - **私有或其他受限访问级别方法**:如果想要访问非公有的成员,则需改用 `getDeclaredMethod(name, parameterTypes)` 。这会返回声明于当前型的任何可见度级别的方法,而不仅仅是那些对外暴露出来的部分[^4]。 #### 设置可访问权限 某些情况下,默认的安全管理器可能会阻止对非公共成员的操作。为了绕过这些限制,在尝试执行之前应先调用 `setAccessible(true)` ,从而临时提升对该组件的控制权以便正常工作。 #### 实际调用过程 最后一步就是实际去触发这个已定位好的功能点了。这是借助 `invoke(obj, args...)` 完成的任务;其中 obj 参数代表实例上下文中应该应用哪个实体上的行为逻辑——如果是静态方法的话则传递 null 值即可[^3]。 下面给出一个综合上述要点的例子演示怎样利用反射技术调用带有一个整型参数的子串提取函数 (`substring`) : ```java // reflection import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws Exception { // 创建一个字符串对象作为测试数据源: String s = "Hello world"; // 查找名为 'substring' 并接受单一 int 参数定义的方法描述符: Method m = String.class.getMethod("substring", int.class); // 应用前面查到的那个 method 描述符至我们的样本 string 上,并提供必要的实参列表(这里是起始索引位置6),最终取得结果赋给新变量r : String r = (String)m.invoke(s, 6); // 输出计算所得的新片段内容确认无误. System.out.println(r); // prints:"world" } } ``` 以上代码展示了标准流程下的简单运用场景。值得注意的是,尽管这里只涉及到了基本概念介绍与单个例子解析,但在真实世界的应用开发当中往往还需要考虑更多细节因素比如异常处理等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值