通过java反射实现统一入口调用不同service的方法

该博客展示了如何使用Spring MVC创建一个统一入口控制器,动态调用不同的服务类方法。通过传递类名、方法名和参数,可以调用DogService和PersonService接口的不同实现,例如DogServiceImpl和PersonServiceImpl的jump和eat方法。示例中使用了反射机制来实现动态方法调用。
摘要由CSDN通过智能技术生成

1.入口controller如下:

interfaceClassName:代表类名,即需要调用哪个类
methodName:方法名,即需要调用的interfaceClassName类中的方法
clientId、password业务参数,根据自己需求来确定要不要
reqData:业务参数,所有业务数据封装在里面,根据自己具体需求来写
package com.example.invoketest.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.invoketest.pojo.ReqData;
import org.apache.catalina.core.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@Controller
public class InvokeDemo {
    //统一入口
    @ResponseBody
    @PostMapping("/postdata")
    public String postdata(@RequestParam(name = "interfaceClassName") String interfaceClassName,
                           @RequestParam(name = "methodName") String methodName,
                           @RequestParam(name = "clientId") String clientId,
                           @RequestParam(name = "password") String password,
                           @RequestBody ReqData reqData) throws Exception {

        JSONObject jsonObject = reqData.getData();

        //通过Class.forName获得类
        Class testClass= Class.forName(interfaceClassName);
        Object obj=testClass.newInstance();

        //调用一个参数的jump
        Method m=testClass.getDeclaredMethod(methodName,String.class); //通过类来获得类方法
        String result = (String)m.invoke(obj,clientId+'|'+password);//通过invoke调用类方法

        //调用2个参数jump
        Method m2=testClass.getDeclaredMethod(methodName,String.class,String.class);
        String result2 = (String)m2.invoke(obj,clientId,password);

        //一个JSONObject参数 传body中的对象
        Method m3=testClass.getDeclaredMethod(methodName,JSONObject.class);
        String result3 = (String)m3.invoke(obj,jsonObject);

        System.out.println("結果:"+result);
        return result;
    }
}

2.两个服务类如下

1)DogService和DogServiceImpl
package com.example.invoketest.service;

import com.alibaba.fastjson.JSONObject;

public interface DogService {
    //jump方法重载
    public String jump(String exchangeId);//一个String参数
    public String jump(String client,String password);//二个String参数
    public String jump(JSONObject jsonObject);//一个JSONObject参数

    //eat方法
    public String eat(String exchangeId);
    public String eat(String client,String password);
    public String eat(JSONObject jsonObject);

    //其他参数类型自行组合
}
package com.example.invoketest.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.example.invoketest.service.DogService;
import org.springframework.stereotype.Service;

@Service
public class DogServiceImpl implements DogService {

    public String jump(String exchangeId){
        System.out.println("Dog jump一个String参数:"+exchangeId);
        return exchangeId;
    }
    public String jump(String client,String password){
        System.out.println("Dog jump两个个String参数:"+client+password);
        return client;
    }
    public String jump(JSONObject jsonObject){
        System.out.println("Dog jump一个JSONObject参数:"+jsonObject.toString());
        return jsonObject.toString();
    }

    public String eat(String exchangeId){
        System.out.println("Dog eat,一个String参数:"+exchangeId);
        return exchangeId;
    }
    public String eat(String client,String password){
        System.out.println("Dog eat,二个String参数:"+client+password);
        return client+password;
    }

    public String eat(JSONObject jsonObject){
        System.out.println("Dog eat一个JSONObject参数:"+jsonObject.toString());
        return jsonObject.toString();
    }

}

2)PersonService和PersonServiceImpl

package com.example.invoketest.service;

import com.alibaba.fastjson.JSONObject;

public interface PersonService {

    public String jump(String exchangeId);//一个Stirng参数
    public String jump(String client,String password);//二个Stirng参数
    public String jump(JSONObject jsonObject);//一个JSONObject参数

    //eat方法
    public String eat(String exchangeId);
    public String eat(String client,String password);
    public String eat(JSONObject jsonObject);


    //其他参数类似 就这样组合即可

}

package com.example.invoketest.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.example.invoketest.service.PersonService;
import org.springframework.stereotype.Service;

@Service
public class PersonServiceImpl implements PersonService {
    public String jump(String exchangeId){
        System.out.println("Person jump,一个String参数:"+exchangeId);
        return exchangeId;
    }
    public String jump(String client,String password){
        System.out.println("Person jump,两个个String参数:"+client+password);
        return client+password;
    }
    public String jump(JSONObject jsonObject){
        System.out.println("Person jump,一个JSONObject参数:"+jsonObject.toString());
        return jsonObject.toString();
    }

    public String eat(String exchangeId){
        System.out.println("Person eat,一个String参数:"+exchangeId);
        return exchangeId;
    }
    public String eat(String client,String password){
        System.out.println("Person eat,两个String参数:"+client+password);
        return client+password;
    }
    public String eat(JSONObject jsonObject){
        System.out.println("Person eat,两个String参数:"+jsonObject.toString());
        return jsonObject.toString();
    }
}

3.调用测试

1.调用DogServiceImpl的jump方法

 

2.调用PersonServiceImpl的jump方法

 

如上,就通过了传递不同的参数调用不同类的不同方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值