【RMI】使用Java反射机制实现RMI

主要包括如下类

RMIBeansManager.java
RMIDemo.java
RMIService.java
RMIVO.java
SayHello.java

RMIVO.java

package com.sssppp.RMI;

public class RMIVO {
	private String beanName; //对应的bean
	private String method;   //方法名
	private String params;   //方法参数

	public String getBeanName() {
		return beanName;
	}

	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}

	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public String getParams() {
		return params;
	}

	public void setParams(String params) {
		this.params = params;
	}

}

RMIService.java

package com.sssppp.RMI;

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

import com.sssppp.Json.jackson.Utils.JsonUtil;

public class RMIService {
	public String call(RMIVO rmi) {
		Object bean = RMIBeansManager.getBean(rmi.getBeanName());
		Method method = findMethod(bean, rmi.getMethod());

		String retValue = null;
		if (method == null) {
			System.out.println("Can not get method: " + rmi.getMethod());
		} else {
			try {
				Object obj;
				if (rmi.getParams() == null) {
					obj = method.invoke(bean);
				} else {
					obj = method.invoke(bean, rmi.getParams());
				}
				retValue = convertToJson(obj);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}
		return retValue;
	}

	private Method findMethod(Object bean, String methodName) {
		for (Method method : bean.getClass().getMethods()) {
			if (method.getName().equals(methodName)) {
				return method;
			}
		}
		return null;
	}

	private String convertToJson(Object obj) {
		try {
			return JsonUtil.parseObjectToJsonString(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}

}

RMIBeansManager.java

用于获取bean

package com.sssppp.RMI;

import javax.ws.rs.POST;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class RMIBeansManager {

	private static ApplicationContext context = null;

	@POST
	private static void init() {
		try {
			context = new ClassPathXmlApplicationContext(
					"/conf/spring-conf/rmiBean.xml");
		} catch (Exception e) {

		}
	}

	public static Object getBean(String beanName) {
		Object retObject = null;
		retObject = getContext().getBean(beanName);
		return retObject;
	}

	public static ApplicationContext getContext() {
		if (context == null) {
			init();
		}
		return context;
	}
}

对应的rmiBean.xml的内容如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
	
	<context:component-scan base-package="com.sssppp.RMI" />

</beans>

SayHello.java

package com.sssppp.RMI;

import org.springframework.stereotype.Component;

@Component("sayHello")
public class SayHello {
	public void welcome(String name) {
		System.out.println("Welcome , hello " + name);
	}
}

RMIDemo.java

package com.sssppp.RMI;

public class RMIDemo {
	
	public static void main(String[] args) {
		RMIVO rmivo = new RMIVO();
		rmivo.setBeanName("sayHello");
		rmivo.setMethod("welcome");
		rmivo.setParams("Tom");
		
		RMIService rmiService = new RMIService();
		rmiService.call(rmivo);
	}
}

调试结果

Welcome , hello Tom
原文地址:https://www.cnblogs.com/ssslinppp/p/6669159.html