我使用Java反射从本地应用程序调用远程服务器中的方法。作为调用该方法的请求的一部分,我还发送了Class对象的状态,该对象包含在运行时由方法修改的变量的值,这样当远程调用该方法并且应用程序获得来自服务器的结果,修改过的变量可以在我的本地应用程序中更新。
客户端
public MyClass {
double var1;
...
public long dotest(){
Method toExecute;
Class<?>[] paramTypes = null;
Object[] paramValues = null;
Long result = null;
try{
/*
* Method specifications are stored and sent in a Class called MyPack to the server
*/
toExecute = this.getClass().getDeclaredMethod("localdotest", paramTypes);
Vector results = getCloudController().execute(toExecute,paramValues,this,this.getClass());
if(results != null){
result = (Long)results.get(0);
copyState(results.get(1));
}else{
result = localdotest();
}
} catch (SecurityException se){
} catch (NoSuchMethodException ns){
} catch (Throwable th){
}
return result;
}
public void copyState(Object state){
MyClass
localstate = (MyClass) state;
this.var1 = localstate.var1;
}
服务器
myPack = (Pack) ois.readObject();
functionName = myPack.getfunctionName();
paramTypes = myPack.getparamTypes();
paramValues = myPack.getparamValues();
state = myPack.getstate();
stateDType = myPack.getstateType();
try {
Class cls = Class.forName(stateDType.getName());
Method method = cls.getDeclaredMethod(functionName, paramTypes);
try{
Object result = method.invoke(state, paramValues);
ResultPack rp = new ResultPack(result, state);
oos.writeObject(rp);
oos.flush();
} catch (IllegalAccessException ex) {
returnnull(oos);
} catch (InvocationTargetException ex) {
returnnull(oos);
} catch(Exception ex){
ResultPack rp = new ResultPack(null, state);
oos.writeObject(rp);
oos.flush();
}
但是,我注意到远程调用方法时发送的Class的状态始终相同。所以,我打算在服务器中缓存类的状态。目标是避免每次调用方法时发送相同的状态。
到目前为止,我认为没有任何问题。我试图找到相关的东西,这些链接1,2是我找到的最接近的主题,但我仍然无法摆脱这种“痒”。有人可以指出,如果采用这种策略有任何潜在的缺点。提前谢谢。