如一楼所言,我猜想一下,根据java命名规范,你确定是Execute而不是execute?
解决方案 »
- 利用dom解析获取文件title时怎样忽略异常获取到title的文本值
- collection was not processed by flush() org.hibernate.AssertionFailure:
- JAVA IO流小结
- 关于填加海图获取GPS导航信息
- 那位牛人推荐几本初学计算机原理基础到一步步成为编成员的书,要经典啊!垃圾不要!什么样的编程员都可以啊!
- SQL Server 2005 jdbc驱动
- 请问在JAVA的线程里怎么建立一个信号量?
- 新手请教下actionPerformed抽象方法的返回值应该怎么做???(在线等,急~~~)
- 急急急!!!兼职招聘
- lucene 在 search的时候区分大小写问题。
- 解析XML错误:Invalid encoding name "GBK".???
- 第一次用Jbuilder,有几个问题请教
另外,我在被调用类中import了javax.servlet.http.*,结果在初始化URLClassLoader时,一定要将servlet-api.jar也加入到URL路径中去,否则在classLoader时会报错,这难道是必须的吗?
我的运行环境是Tomcat5.0.16,jdk1.4.2
package com.userlibrary;
import javax.servlet.http.*;
import com.user.*;
public class Demo
{
public Demo()
{
}
public Boolean Execute( HttpServletResponse response , HttpServletRequest request , cuser CurUser )
{
try
{
System.out.print( request.getParameter( "username" ) );
System.out.print( CurUser.CurrentUserName );
}
catch( Exception e )
{
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}
URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
URL servlet = urlLoader.findResource( "../lib/serlet-api.jar" );//这句是必须的吗?
URL[] u = { urlLoader.getURLs()[0] , servlet };
URLClassLoader classLoader = new URLClassLoader( u );//没有上面那句的话,这句就会报错
Class cls = classLoader.loadClass( "com.userlibrary.Demo" );
Class[] ptypes = new Class[]{ HttpServletResponse.class , HttpServletRequest.class , cuser.class };
Method main = cls.getDeclaredMethod( "Execute" , ptypes );//现在这里就出错了
main.invoke( cls.newInstance() , new Object[]{ response , request , CurUser} )
Class cls = Class.forName( "com.userlibrary.Demo" );真是百思不得其解,还望高人指点.
URL url = new URL("../lib/serlet-api.jar");
URL[] urls = new URL[]{url};
URLClassLoader classLoader = new URLClassLoader(urls,this.getClass().getClassLoader());
Class cls = classLoader.loadClass( "com.userlibrary.Demo" );
主要就是URLClassLoader classLoader = new URLClassLoader( urls , this.getClass().getClassLoader() );这句的问题.我原先没有加this.getClass().getClassLoader()这个参数,所以执行不了.加了这个参数后,不但执行可以了.URL servlet = urlLoader.findResource( "../lib/serlet-api.jar" );这句也就不用加了.
那能不能解释一下,加这个参数的作用是什么?(我的理解是把urls里要加载的类装载到this.getClass().getClassLoader()的执行环境中,使它们在同一环境中运行.)
还希望能说明一下,Class.forName()也可以达到同样的效果,那这两种方法有什么区别,谁更好些(从代码上看Class.forName()方法要简洁些).
URL servlet = urlLoader.findResource( "../lib/serlet-api.jar" );
得出得URL应该是空的吧.
如果要ucl包括指定的资源,需要在创建它的时候就指定,所以开始就创建一个URL作为构造函数的参数给它,是定位资源包的唯一手段.
还有一个可能,就是每个类载入器一般都有一个父载入器,而他可能会从父载入器继承一些特性,这个我就没有试了,你可以试一下看把ucl构造函数中的this.getClass().getClassLoader()参数去掉,看行不行?
以上是我的理解,不知对不对,大家给些意见