以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Java/Eclipse 』  (http://bbs.xml.org.cn/list.asp?boardid=41)
----  [合集] 怎么改变rmi得classloader?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=10277)


--  作者:admin
--  发布时间:9/23/2004 12:40:00 AM

--  [合集] 怎么改变rmi得classloader?
● [合集] 怎么改变rmi得classloader?发信人: diaochong (静静的雕虫~~小猪), 信区: J2EE
标  题: [合集] 怎么改变rmi得classloader?
发信站: BBS 水木清华站 (Tue Mar 30 10:12:59 2004), 站内

【 以下文字转载自 JavaClub 讨论区 】
发信人: diaochong (静静的雕虫~~小猪), 信区: JavaClub
标  题: [合集] 怎么改变rmi得classloader?
发信站: BBS 水木清华站 (Tue Mar 30 10:08:34 2004), 站内

☆─────────────────────────────────────☆  
  bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 11:23:00 2003)  提?


defineClass()不允许定义"java"开头的类,而这方法又是final的。有什么办法去载入
java.rmi的类呢?我需要让rmi server使用自定义的classloader
那平时系统是怎么载入这些类的呢?
另外,resolveClass实际对class做了什么处理?



☆─────────────────────────────────────☆  
  gty (宜良-丽江-蝴蝶泉) 于  (Fri Mar 21 11:53:43 2003)  提到:


你想改变java.rmi下的类?为什么要这么做?

【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                
: defineClass()不允许定义"java"开头的类,而这方法又是final的。有什么办法去载入  
: java.rmi的类呢?我需要让rmi server使用自定义的classloader                     
: 那平时系统是怎么载入这些类的呢?                                              
: 另外,resolveClass实际对class做了什么处理?                                   


☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 11:57:44 2003)  提?


不是,我要用自己的classloader载入类(不以class文件形式存在),但是rmi载入stub时
是用系统的classloader,结果就是找不到class,所以我要换掉rmi的classloader,如果
有更好的方法也行

【 在 gty (宜良-丽江-蝴蝶泉) 的大作中提到: 】                                   
: 你想改变java.rmi下的类?为什么要这么做?                                      

☆─────────────────────────────────────☆  
sOcean (ok) 于  (Fri Mar 21 16:07:14 2003)  提到:


那些都是本地方法,恐怕得弄到sun的source才能看到
private native Class defineClass0
private native void resolveClass0

【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                

defineClass()不允许定义"java"开头的类,而这方法又是final的。有什么办法去载入
java.rmi的类呢?我需要让rmi server使用自定义的classloader
那平时系统是怎么载入这些类的呢?
另外,resolveClass实际对class做了什么处理?



☆─────────────────────────────────────☆  
  sOcean (ok) 于  (Fri Mar 21 16:12:56 2003)  提到:


用自己的java.rmi.registry.RegistryImpl 代替sun.rmi.registry.RegistryImpl?

  或者写一个自己的RemoteProxy彻底替换sun.rmi.server.RemoteProxy?

【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                
: 不是,我要用自己的classloader载入类(不以class文件形式存在),但是rmi载入stub时
: 是用系统的classloader,结果就是找不到class,所以我要换掉rmi的classloader,如果
: 有更好的方法也行                                                              


☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 16:15:50 2003)  提?


是个思路,等我试试

【 在 sOcean (ok) 的大作中提到: 】                                              
:   用自己的java.rmi.registry.RegistryImpl 代替sun.rmi.registry.RegistryImpl?  


☆─────────────────────────────────────☆  
UltraFool (遥望·遐想·感伤) 于  (Fri Mar 21 19:13:31 2003)  提到:

好像是java的核心类是系统的本地函数的Classloader加载, 不允许用自定义的loader加载

【 在 sOcean (ok) 的大作中提到: 】                                              
: 那些都是本地方法,恐怕得弄到sun的source才能看到                               
: private native Class defineClass0                                             
: private native void resolveClass0
: defineClass()不允许定义"java"开头的类,而这方法又是final的。有什么办法去载入  
: java.rmi的类呢?我需要让rmi server使用自定义的classloader                     
: 那平时系统是怎么载入这些类的呢?                                              
: 另外,resolveClass实际对class做了什么处理?                                   



☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 19:17:29 2003)  提?

一般来说应该这样
现在问题是核心类会加载非核心类,例如RMI加载stub,如果不用自定义classloader加载
java.rmi的类,就没法控制stub的加载了,faint

【 在 UltraFool (遥望·遐想·感伤) 的大作中提到: 】                             
: 好像是java的核心类是系统的本地函数的Classloader加载, 不允许用自定义的loader加
载                                                                              


☆─────────────────────────────────────☆  
UltraFool (遥望·遐想·感伤) 于  (Fri Mar 21 19:22:12 2003)  提到:

呵呵, 不太清楚
看appserver的source也许有帮助
不过有java.rmi的源代码吗? 把他们的包换了可否

【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                
: 一般来说应该这样                                                              
: 现在问题是核心类会加载非核心类,例如RMI加载stub,如果不用自定义classloader加载
: java.rmi的类,就没法控制stub的加载了,faint                                   


☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 19:30:54 2003)  提?


呵呵,对java.rmi进行refactoring,改包名……
rmi的实现基本在sun的包中,没有源码,我反编译看过,也是很多native方法,不敢乱动

【 在 UltraFool (遥望·遐想·感伤) 的大作中提到: 】                             
: 呵呵, 不太清楚                                                                
: 看appserver的source也许有帮助                                                 
: 不过有java.rmi的源代码吗? 把他们的包换了可否                                  




☆─────────────────────────────────────☆  
gty (宜良-丽江-蝴蝶泉) 于  (Fri Mar 21 20:08:42 2003)  提到:


csdn上有一篇比较早的文章,介绍了dynamic proxy怎么改变rmi的行为

http://www.csdn.net/develop/article/14/14553.shtm
【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                
: 呵呵,对java.rmi进行refactoring,改包名……                                   
: rmi的实现基本在sun的包中,没有源码,我反编译看过,也是很多native方法,不敢乱动


☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 20:24:06 2003)  提?


这篇以前看过了,呵呵
我现在做的是一个运行平台,让普通java程序在上面运行,无法修改使用RMI的程序,
所以只能在classloader上下功夫

【 在 gty (宜良-丽江-蝴蝶泉) 的大作中提到: 】                                   
: csdn上有一篇比较早的文章,介绍了dynamic proxy怎么改变rmi的行为                
: http://www.csdn.net/develop/article/14/14553.shtm


☆─────────────────────────────────────☆  
sOcean (ok) 于  (Fri Mar 21 22:37:20 2003)  提到:


sun包可以到www.sun.com上下载jdksource package。
  粗略的看了一下,class loading的部分大概在
    sun.rmi.server.RemoteProxy.loadClassFromClass()
    /**
     * Load a class from the same class loader that loaded another class.
     * If the other class has no class loader, or if it isn't supplied,
     * then it simply loads the class using the system loader (through
     * CLASSPATH, typically).
     */

【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                
: 呵呵,对java.rmi进行refactoring,改包名……                                   
: rmi的实现基本在sun的包中,没有源码,我反编译看过,也是很多native方法,不敢乱动


☆─────────────────────────────────────☆  
sOcean (ok) 于  (Fri Mar 21 22:53:35 2003)  提到:

【 在 bakkhos (笨瓶子) 志存高远·思考永不停步 ) 的大作中提到: 】                
: defineClass()不允许定义"java"开头的类,而这方法又是final的。有什么办法去载入  
: java.rmi的类呢?我需要让rmi server使用自定义的classloader                     
: 那平时系统是怎么载入这些类的呢?                                              
: 另外,resolveClass实际对class做了什么处理?                                   

  如果纯粹想载入java.rmi的类,把java.lang.ClassLoader.defineClass(0
  中的  if ((name != null) && name.startsWith("java.")) {
  去掉就行了吧。不过不知道这样修改对系统会有什么影响...

     * The specified class name cannot begin with "java.", since all
     * classes in the java.* packages can only be defined by the bootstrap
     * class loader.

☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 23:06:50 2003)  提?


实在没有办法时再用吧,这种方法可能有危险,以后升级也可能有麻烦

【 在 sOcean (ok) 的大作中提到: 】                                              
: 如果纯粹想载入java.rmi的类,把java.lang.ClassLoader.defineClass(0           
:   中的  if ((name != null) && name.startsWith("java.")) {                     
:   去掉就行了吧。不过不知道这样修改对系统会有什么影响...                       
:      * The specified class name cannot begin with "java.", since all          
:      * classes in the java.* packages can only be defined by the bootstrap    
:      * class loader.                                                          



☆─────────────────────────────────────☆  
bakkhos (笨瓶子) 志存高远·思考永不停步 ) 于  (Fri Mar 21 23:06:50 2003)  提?


实在没有办法时再用吧,这种方法可能有危险,以后升级也可能有麻烦

【 在 sOcean (ok) 的大作中提到: 】                                              
:   如果纯粹想载入java.rmi的类,把java.lang.ClassLoader.defineClass(0           
:   中的  if ((name != null) && name.startsWith("java.")) {                     
:   去掉就行了吧。不过不知道这样修改对系统会有什么影响...                       
:      * The specified class name cannot begin with "java.", since all          
:      * classes in the java.* packages can only be defined by the bootstrap    
:      * class loader.                                                          


※ 修改:·qyjohn 于 Mar 30 10:16:02 修改本文·[FROM:   219.238.203.*]           

索引页面|上一篇|下一篇


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms