js中类似于java的Class.forName()的代码实现

本文介绍了一种在JavaScript中通过eval动态实例化类的方法,并提供了一个具体的例子,展示如何使用字符串来创建类的实例。

 

如在js中,已知类名的时候可以这样做

var text1 = new Ext.Form.TextField();

 

当类名是参数传递的时候或者是字符串的时候,可以这样做

var clazz = 'Ext.Form.TextField';

 

var text2 = eval('new ' + clazz + '()');

 

 

这样得到的text1与text2是完全一样的,哈哈。

是不是和java中的Class.forName有异曲同工之妙呢!

 

欢迎网友提出更好的解决方案……

 

期待中……

 

 

 

10:11:34.853 [main] DEBUG org.apache.commons.vfs2.cache.SoftRefFilesCache - putFile: file:///D:/data/dc/ktr/30002/ygcg.ktr 10:11:35.171 [main] DEBUG org.apache.commons.vfs2.cache.SoftRefFilesCache - putFile: file:///C:/Users/15835/.kettle/shared.xml java.lang.NoClassDefFoundError: org/mozilla/javascript/JavaScriptException at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:375) at org.pentaho.di.core.plugins.PluginRegistry.loadClass(PluginRegistry.java:499) at org.pentaho.di.core.plugins.PluginRegistry.loadClass(PluginRegistry.java:356) at org.pentaho.di.trans.step.StepMeta.<init>(StepMeta.java:311) at org.pentaho.di.trans.TransMeta.loadXML(TransMeta.java:3075) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2809) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2750) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2727) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2707) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2672) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2635) at cn.youth.datacollection.util.DateUtil.main(DateUtil.java:311) Caused by: java.lang.ClassNotFoundException: org.mozilla.javascript.JavaScriptException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 13 more org.pentaho.di.core.exception.KettleXMLException: 错误从XML文件读取转换 错误从XML文件读取转换 Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettlePluginException: Unexpected error loading class: org/mozilla/javascript/JavaScriptException Unexpected error loading class: org/mozilla/javascript/JavaScriptException at org.pentaho.di.trans.TransMeta.loadXML(TransMeta.java:3460) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2809) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2750) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2727) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2707) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2672) at org.pentaho.di.trans.TransMeta.<init>(TransMeta.java:2635) at cn.youth.datacollection.util.DateUtil.main(DateUtil.java:311) Caused by: org.pentaho.di.core.exception.KettleXMLException: 错误从XML文件读取转换 Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettlePluginException: Unexpected error loading class: org/mozilla/javascript/JavaScriptException Unexpected error loading class: org/mozilla/javascript/JavaScriptException at org.pentaho.di.trans.TransMeta.loadXML(TransMeta.java:3442) ... 7 more Caused by: org.pentaho.di.core.exception.KettleXMLException: Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettlePluginException: Unexpected error loading class: org/mozilla/javascript/JavaScriptException Unexpected error loading class: org/mozilla/javascript/JavaScriptException at org.pentaho.di.trans.step.StepMeta.<init>(StepMeta.java:396) at org.pentaho.di.trans.TransMeta.loadXML(TransMeta.java:3075) ... 7 more Caused by: org.pentaho.di.core.exception.KettlePluginException: Unexpected error loading class: org/mozilla/javascript/JavaScriptException at org.pentaho.di.core.plugins.PluginRegistry.loadClass(PluginRegistry.java:519) at org.pentaho.di.core.plugins.PluginRegistry.loadClass(PluginRegistry.java:356) at org.pentaho.di.trans.step.StepMeta.<init>(StepMeta.java:311) ... 8 more Caused by: java.lang.NoClassDefFoundError: org/mozilla/javascript/JavaScriptException at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:375) at org.pentaho.di.core.plugins.PluginRegistry.loadClass(PluginRegistry.java:499) ... 10 more Caused by: java.lang.ClassNotFoundException: org.mozilla.javascript.JavaScriptException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 13 more Disconnected from the target VM, address: '127.0.0.1:62237', transport: 'socket'
08-30
<think> 首先,用户的问题是关于解决Java程序中的错误:java.lang.NoClassDefFoundError: org/mozilla/javascript/JavaScriptException 和 java.lang.ClassNotFoundException: org.mozilla.javascript.JavaScriptException。这些错误导致了KettleXMLException。用户提到了引用[1]到[5],但这些引用是关于NoClassDefFoundError和ClassNotFoundException的一般解释和解决方法。关键点是org.mozilla.javascript.JavaScriptException类。 根据系统指令: - 所有行内数学表达式使用$...$格式。但用户的问题涉及Java错误,没有数学表达式,所以可能不需要。 - 独立公式使用$$...$$格式并单独成段。同样,这里没有公式。 - LaTeX语法正确。需要确保任何数学部分正确,但用户的问题主要是文本。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 用户的问题集中在解决特定的Java错误。这些错误通常发生在类加载失败时: - ClassNotFoundException:编译时或运行时找不到类。 - NoClassDefFoundError:运行时找不到类的定义,可能在类的初始化阶段失败。 具体错误涉及org.mozilla.javascript.JavaScriptException,这表明程序使用了Mozilla Rhino JavaScript引擎。KettleXMLException暗示用户在使用Pentaho Kettle(也称为Pentaho Data Integration),因为Kettle是它的旧名。 常见原因: 1. 缺少JAR文件:如rhino.jar或包含org.mozilla.javascript包的JAR。 2. 类路径问题:类路径未正确设置,导致JVM找不到类。 3. 依赖冲突:如果使用了多个版本的JAR。 4. 环境问题:如IDE或服务器配置错误。 解决步骤: - 确保添加了所需的JAR文件。对于Rhino,可能是rhino-X.X.jar。 - 检查类路径(classpath)是否正确。 - 如果使用Maven或Gradle,添加依赖。 - 清理和重建项目。 - 检查是否有版本兼容性问题。 引用[^1]到[^5]提供了背景,但用户的问题具体到org.mozilla.javascript.JavaScriptException,我需要针对性地回答。 回答结构: 1. 解释错误的原因。 2. 提供详细解决步骤。 3. 生成相关问题。 使用中文回答。 添加引用标识:在引用的段落末尾添加[^数字],但这里的引用是用户提供的,我需要引用它们或将它们融入回答。指令说“回答中引用的段落末尾自然地添加引用标识”,意思是如果我引用用户的引用,就添加标识。但用户说“上述引用仅供参考”,所以我应该基于它们提供通用建议,但针对用户的特定问题。 用户说:“我想解决Java程序中出现的...错误”,所以我直接回答这个。 最终回答: - 结构化清晰:先概述错误,再分步解决。 - 结尾生成相关问题。 大纲: 1. 介绍错误:解释NoClassDefFoundError和ClassNotFoundException的区别和原因。 2. 针对特定错误的原因:由于缺少org.mozilla.javascript包。 3. 解决方法: a. 添加所需的JAR文件(如rhino.jar)。 b. 检查类路径配置。 c. 验证构建工具依赖。 d. 清理项目。 e. 检查Kettle相关配置。 4. 生成相关问题。 添加引用标识:例如,说到一般原因时,引用[^1]或[^4]。 例如:“根据引用[^1],NoClassDefFoundError发生在运行时找不到类定义时。” 生成相关问题: - 类似于示例,3-5个问题。 - 如:如何添加JAR到类路径?如何解决Kettle依赖问题?等。 确保语言:中文。 </think> ### 解决Java程序中的java.lang.NoClassDefFoundError和ClassNotFoundException错误 您的问题涉及Java运行时抛出的两个关键错误:`java.lang.NoClassDefFoundError: org/mozilla/javascript/JavaScriptException` 和 `java.lang.ClassNotFoundException: org.mozilla.javascript.JavaScriptException`,这些错误可能导致`KettleXMLException`(通常与Pentaho Kettle工具相关)。下面我将逐步解释错误原因并提供详细的解决方法。这两个错误都与类加载失败有关,但本质不同: - **ClassNotFoundException**:发生在编译或运行时明确尝试加载一个类,但JVM在classpath中找不到该类(通常是环境配置问题)[^1][^4]。 - **NoClassDefFoundError**:发生在运行时JVM已经加载过类,但在初始化或使用时发现类的定义缺失(可能由于依赖链断裂或类初始化失败)[^1][^3]。 在您的案例中,错误聚焦于`org.mozilla.javascript.JavaScriptException`类,这表明程序依赖Mozilla Rhino JavaScript引擎(常见于Kettle等工具)。根本原因通常是: 1. **缺少JAR文件**:Rhino库(如`rhino.jar`或包含`org.mozilla.javascript`包的JAR)未添加到classpath中。 2. **类路径配置错误**:classpath设置不正确,导致JVM运行时找不到所需类。 3. **版本冲突**:项目中可能存在多个Rhino版本,导致依赖混乱。 4. **构建或环境问题**:IDE、构建工具(如Maven)或服务器配置不当,引发加载失败[^2][^5]。 ### 详细解决步骤 请按顺序执行以下步骤,确保覆盖所有可能原因。操作前备份项目代码。 #### 步骤1: 添加必需的JAR文件 确保`org.mozilla.javascript.JavaScriptException`类对应的JAR文件存在。针对Rhino引擎: - **下载Rhino JAR**: - 访问 [Mozilla Rhino官网](https://github.com/mozilla/rhino/) 或 Maven中央仓库。 - 下载最新稳定版JAR(如`rhino-1.7.14.jar`)。 - **添加JAR到项目**: - 如果使用IDE(如Eclipse或IntelliJ): - 右键项目 -> Build Path -> Add External Archives -> 选择下载的JAR文件。 - 如果命令行运行: - 在运行命令中添加classpath参数: `java -cp .;<path-to-jar>/rhino-1.7.14.jar your.package.MainClass` - 如果使用构建工具(如Maven): - 在`pom.xml`中添加依赖: ```xml <dependency> <groupId>org.mozilla</groupId> <artifactId>rhino</artifactId> <version>1.7.14</version> <!-- 使用最新版本 --> </dependency> ``` - 运行`mvn clean install`重新构建项目。 - **验证**:检查JAR文件是否包含`org/mozilla/javascript/JavaScriptException.class`路径。 #### 步骤2: 检查和修复类路径 classpath错误是常见原因,参考引用[^4]的建议: - **检查当前classpath**: - 命令行中运行:`echo %CLASSPATH%`(Windows)或 `echo $CLASSPATH`(Linux/Mac)。 - 确保路径包含Rhino JAR和您的项目目录。 - **IDE特定配置**: - Eclipse:右键项目 -> Properties -> Java Build Path -> Libraries -> 确认JAR已添加。 - IntelliJ:File -> Project Structure -> Modules -> Dependencies -> 添加JAR。 - **处理Kettle特定依赖**: - Kettle可能依赖Rhino。如果您使用Pentaho Kettle,确保Kettle的lib目录包含Rhino JAR。 - 下载Kettle完整发行版,将`rhino.jar`从Kettle的`libext`目录复制到您的项目lib中。 - 如果您通过代码调用Kettle API,检查初始化代码是否有路径错误: ```java // 示例:确保Kettle环境初始化正确 KettleEnvironment.init(); ``` 如果出错,验证Kettle的核心JAR(如`kettle-core.jar`)是否在classpath中[^5]。 #### 步骤3: 解决版本冲突和依赖问题 依赖冲突可能引发`NoClassDefFoundError`: - **检查依赖树**: - Maven运行:`mvn dependency:tree`,查找是否有多个Rhino版本。 - 如果冲突,在`pom.xml`中排除冗余依赖: ```xml <dependency> <groupId>your.dependency.group</groupId> <artifactId>dependency-artifact</artifactId> <version>x.x.x</version> <exclusions> <exclusion> <groupId>org.mozilla</groupId> <artifactId>rhino</artifactId> </exclusion> </exclusions> </dependency> ``` - **清理和重建项目**: - IDE中:执行Clean Project或Rebuild。 - Maven:运行`mvn clean install`。 - 手动删除`target`或`bin`目录,然后重新编译。 #### 步骤4: 测试和验证 - 运行一个小测试程序加载Rhino类: ```java public class TestRhino { public static void main(String[] args) { try { Class.forName("org.mozilla.javascript.JavaScriptException"); System.out.println("类加载成功!"); } catch (ClassNotFoundException e) { System.out.println("ClassNotFoundException: " + e.getMessage()); } } } ``` - 如果KettleXMLException仍出现,检查Kettle日志: - 确保Kettle配置文件中(如`kettle.properties`)没有路径错误。 - 更新Kettle到最新版本,兼容性问题可能已修复。 #### 常见陷阱 - **环境变量**:确保`JAVA_HOME`和PATH变量正确设置。 - **IDE缓存**:重启IDE可解决临时缓存问题。 - **服务器部署**:如果部署到Tomcat等服务器,将JAR复制到`WEB-INF/lib`目录。 - **代码动态加载**:避免使用`Class.forName()`等动态加载方式,除非有错误处理。 如果所有步骤失败,考虑调试类加载器: - 使用`-verbose:class` JVM参数运行程序: `java -verbose:class -cp your_classpath your.MainClass` 输出日志中搜索`org.mozilla.javascript`,看加载尝试是否失败。 ### 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值