请教(100分)

  • 主题发起人 主题发起人 hyzou
  • 开始时间 开始时间
H

hyzou

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道这种调用方法(如下)
Class cls=OBJ.class;
Object obj=cls.newInstance();
Method method=cls.getMethod("method",arrayClass);
return method.invoke(obj,arrayParameters);
问题是每次调用都会生成一个新的实例。如果想仍然使用上一次生成的实例,应该怎样作?

 
把obj作为当前类的member,如果没有赋值才先cls.newInstance();

-----
http://www.8421.org
 
sorry,没说清楚
比如说这个方法为
public Object invoke(String className,String methodName,Object [] arrayParameters,Class [] arrayClass)
{
Class cls=Class.forName(className);
Object obj=cls.newInstance();
Method method=cls.getMethod("methodName",arrayClass);
return method.invoke(obj,arrayParameters);
}
外部调用为
class x
{
public void xxx()
{
invoke("class1","method1",arrayParameters1,arrayClass1);
invoke("class1","method2",arrayParameters2,arrayClass2);
invoke("class1","method3",arrayParameters3,arrayClass3);
}
}
在同一个实例x的xxx方法中,希望调用到的实例是同一个,
但在不同实例的x的xxx方法中,调用到的实例应该不是同一个。
 
这个问题的设计有些混乱。为什么你要传递'class1'和'method1'过去呢?
你还是在采用结构化编程的思想,并不是面向对象的做法。
至少你应该传递一个实例过去,然后invoke这个实例的方法。
 
有很多场合需要这样作,如远程调用,事务处理,模块、平台之间的调用
以远程调用为例,如果是直接传递对象,就要为每一个类写一个接口,至少是需要每一个类的存根。
无论服务器端还是客户端,工作流都会成n倍增加。
而实际上我们只需要类方法调用的结果。更何况如果是调用其它企业内部的类,人家因为安全等因素根本就不直接暴露这些结构。
 
但是那个类的实例你总是能够得到的吧?我没跟你讨论invoke的合理性问题。
所以你上面的跟贴都是不知所云。
你为什么要
Class cls=Class.forName(className);
Object obj=cls.newInstance();
这里新建一个Object有任何意义吗?
>在同一个实例x的xxx方法中,希望调用到的实例是同一个,
调用的实例是哪一个?
>但在不同实例的x的xxx方法中,调用到的实例应该不是同一个。
分别又应该是哪个实例?
为什么你指望一个单纯的invoke方法来负责这些事情呢?
 
以远程调用为例
invoke所属的类位于企业A,作用是企业A内所有可公开类的一个代理
类x位于企业B,现在是B要得到A的数据,方法是通过A的代理类
还有什么问题吗?
 
在x的一个实例xa中,我希望xa对B的操作是B中obj的同一个实例
而在x的另一个实例xb中,希望xb对B的操作是B中obj的另外的同一个实例。
ok?
 
那你是怎么得到这个"企业A内所有可公开类的一个代理"的?
你得到了之后,再去invoke他,
为什么不用
public Object invoke(Object anObject,String methodName,Object [] arrayParameters,Class [] arrayClass)
而非要把newInstance的任务交给invoke这个方法呢?
如果你想每一个你的X类的实例都只对应一个"企业A内所有可公开类的一个代理"的实例,
你就应该在invoke之前去create他,判断这个应用是否存在。
class X
{
Class ProxyOfA = null;
synchronize (a static context)
{
if (ProxyOfA!=null)
{
ProxyOfA = someMethodToGetNewInstance();
}
}
invoke(ProxyOfA,xxxxxxxx)
 
公开的代理可以用rmi调用,只要B有它的存根即可,或者转化成soap接口。
newInstance交给invoke,是因为这是A企业内的类,所以应当在A企业内生成。
如果B可以直接带着A中类的实例去调用,那么B企业需要A中所有的类,或至少需要有所有的存根。
这个显然是不现实的。无论从工作量还是从安全角度都不应当这样做。
 
我认为你要做这种类似于RMI的事情很有可能最后是一个费力不讨巧的事情。
首先,按照你的要求,你能够把A里面的class序列化后传送给B,那么你维护的是无状态的类了?
你是不是想实现有状态的调用?
 
只有A的公开代理类可以系列化,其它类是不允许的。
另外我认为这是一种很普通,很普遍的设计思想。
很多服务器,他们的对外接口都是这样设计的。
只不过他们不需要处理有状态的调用
 
能不能想一下为什么你需要这样的设计?
我猜你的目的是为了实现有状态的class调用。
在深入问一下,你的这个代理类是在什么时候需要处理不同的实例呢?
我认为你试图在这个代理类内部实现状态维护是不恰当的。如果可能的话,你需要自己做一个
session ticket的机制。
 
就是说,采用显式的session维护。client调用proxy类的时候,采用签到签退的机制,获得session id.
这样,你可以为每一个在服务器A上运行的class维护状态。
 
>以远程调用为例,如果是直接传递对象,就要为每一个类写一个接口,至少是需要每一个类的存根
你的“存根”是什么意思?
我还是认为使用java内置的RMI优于你自己实现proxy.
设计的时候,interface本来就应该在哪儿了。
 
你的意思是为proxy类加一个sessionID标识,是吗?
那么取消session的方式是主动申请和超时机制,是这个意思吧?
 
存根就是stub类了。
但是A企业未必肯公开其interface
 
对。
其实,还不如索性直接使用servlet接口好了。还不用自己负责session。
 
那你现在是在为A企业写程序了?如果不肯公开interface,那你这个proxy类也无从调用起了。
如果你告诉别人,来调用我吧,给你几个函数定义...那不就等于interface吗?
 
当然还是有区别的,proxy类里可以做安全机制。
另外B企业并不需要这些类,他们需要的只是这些类的方法的结果。
如果B有了A的class或者stub,那么通过反编译,他们很容易获得更多的信息。
而且这种方法在实施量上也会变的更大。
 
后退
顶部