java通过字符串调用方法,java反射应用实例

有时候我们希望像Javascript一样通过字符串调用方法,这就需要用到java的反射机制了。

下面给出一个示例:

1、先写一个测试的被调用方法(在 com.test 包下的 MyTest 方法,故全类名就是 com.test.MyTest)

package com.test;
public class MyTest {
	public String hello(String param){
		return "Hello "+param;
	}
}


2、再写一个通过字符串调用其他方法的工具类

public class CallMethod {

    /**
     * 通过字符串串调用方法
     * @param classAndMethod 类名-方法名,通过此字符串调用类中的方法
     * @param paramTypes 方法类型列表(因为方法可能重载)
     * @param params 需要调用的方法的参数列表
     * @return
     */
    public static Object call(String classAndMethod,Class[] paramTypes,Object[] params){
        String[] args=classAndMethod.split("-");
        //要调用的类名
        String className=args[0];
        //要调用的方法名
        String method=args[1];
        try {
            //加载类,参数是完整类名
            Class clazz = Class.forName(className);

            //第一个参数是方法名,后面的参数指示方法的参数类型和个数
            Method method=clazz.getMethod(method,paramTypes);

            //accessiable设为true表示忽略java语言访问检查(可访问private方法)
            //method.setAccessible(true);

            //第一个参数类实例(必须有对象才能调用非静态方法,如果是静态方法此参数可为null)
            //第二个是要传给方法的参数
            Object result=method.invoke(clazz.newInstance(),params);

            return result;

            //这里为了博客上简洁一些把其他catch都去掉了(复制代码的同学应该把其他异常的catch搞出来)
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}


3、写一个main方法测试是否正确调用

public static void main(String[] args) {
	//我们测试要调用的hello方法只有一个String参数
	Class[] paramTypes={String.class};
		
	//给hello方法传参数"World"
	Object[] params={"World"};
		
	Object result=CallMethod.call("com.test.MyTest-hello",paramTypes,params);
		
	//已测试输出 "Hello World"
	System.out.println((String)result);
}

 

 

 

 

 

Java中,如果你想要根据方法名称的字符串调用相应的方法,你可以使用反射(Reflection)API来实现这一功能。反射是一个强大的机制,它允许程序在运行时检查或修改程序的行为。以下是使用反射调用方法的基本步骤: 1. 获取Class对象的引用:首先,你需要获取你想要调用方法的类的Class对象的引用。 2. 获取Method对象:然后,你可以通过Class对象调用`getMethod`方法,并传入方法名和相应的参数类型,来获取对应的Method对象。 3. 创建对象实例:如果方法实例方法,你需要先创建该类的一个实例。 4. 调用方法:最后,使用Method对象的`invoke`方法调用实际的方法。如果是静态方法,可以直接用`null`作为实例参数,否则需要传入相应的对象实例。 下面是一个简单的例子: ```java import java.lang.reflect.Method; public class ReflectionExample { public void myMethod() { System.out.println("My method has been called."); } public static void main(String[] args) { try { // 创建ReflectionExample类的实例 ReflectionExample example = new ReflectionExample(); // 获取ReflectionExample类的Class对象 Class<?> clazz = example.getClass(); // 获取myMethod方法的Method对象 Method method = clazz.getMethod("myMethod"); // 调用myMethod方法 method.invoke(example); } catch (Exception e) { e.printStackTrace(); } } } ``` 使用反射调用方法需要注意以下几点: - 反射通常会比直接调用方法慢,因为它需要额外的时间来解析方法。 - 使用反射时必须处理`NoSuchMethodException`和`IllegalAccessException`等异常。 - 由于反射绕过了编译时的类型检查,因此增加了出错的可能性,需要谨慎使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值