天天看點

【RMI】使用Java反射機制實作RMI

主要包括如下類

RMIBeansManager.java

RMIDemo.java

RMIService.java

RMIVO.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

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;
  }
}      
<?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