当前位置: 首页 > 知识库问答 >
问题:

线程“main”java中出现异常。lang.NoClassDefFoundError:java/lang/Object[duplicate]

严峰
2023-03-14

因此,我有自己的类加载器classServerLoader,它能够通过路径从本地服务器加载类http://localhost/app/1/其中有一些。类文件存在。但当我试图定义某个类的字节码时,我的程序崩溃了。

result = defineClass(name, ByteClass, 0, ByteClass.length);

所以我得到一个异常线程"main"java.lang.NoClassDefFoundError: java/lang/Object

以下是全班同学:

package com.local;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;

public class ServerLoader extends ClassLoader {

    private ClassLoader parent;
    private String urlPath;

    public ServerLoader(String urlPath) {
        parent = ServerLoader.class.getClassLoader();
        this.urlPath = urlPath;
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {

        Class<?> result = null;

        try {
            URL mainUrl = new URL(urlPath + name.substring(11);
            HttpURLConnection conn = (HttpURLConnection) mainUrl.openConnection();
            conn.setRequestMethod("GET");

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            BufferedInputStream input = new BufferedInputStream(conn.getInputStream());

            int data;
            while ((data = input.read()) != -1) {
                out.write(data);
            }

            byte[] ByteClass = out.toByteArray();
            result = defineClass(name, ByteClass, 0, ByteClass.length);
            cacheClass.put(result.getName(), result);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

}    

这是主要的方法

package com.local;

import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws Exception {
        ServerLoader loader = new ServerLoader("http://localhost/app/1/");

        Class<?> remoteInstanceClass = loader.loadClass("com.server.PluginA");

        Method mainMethod = remoteInstanceClass.getMethod("main", String[].class);
        mainMethod.invoke(remoteInstanceClass, (Object) args);
    }
}

和堆栈追踪

com.local.Main
    Connected to the target VM, address: '127.0.0.1:54553', transport: 'socket'
    java.io.FileNotFoundException: http://localhost/app/1/Object.class
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1836)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
        at com.local.ServerLoader.ConnectAndResolveClass(ServerLoader.java:43)
        at com.local.ServerLoader.loadClass(ServerLoader.java:28)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
        at com.local.ServerLoader.ConnectAndResolveClass(ServerLoader.java:51)
        at com.local.ServerLoader.loadClass(ServerLoader.java:28)
        at com.local.Main.main(Main.java:10)
    Exception in thread "main" java.lang.NoClassDefFoundError: java/lang/Object
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
        at com.local.ServerLoader.ConnectAndResolveClass(ServerLoader.java:51)
        at com.local.ServerLoader.loadClass(ServerLoader.java:28)
        at com.local.Main.main(Main.java:10)
    Disconnected from the target VM, address: '127.0.0.1:54553', transport: 'socket'

Process finished with exit code 1

所有路径和名称都正确。那么是什么导致了这个问题呢?


共有1个答案

袁奇玮
2023-03-14

我解决了这个问题。LoadClass方法中的每个类加载器必须首先使用父类加载器加载该类,然后尝试以另一种方式加载它。所以这是正确的LoadClass方法。

@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {

    Class<?> result = null;

    try {
        result = parent.loadClass(name);
    } catch (ClassNotFoundException e) {
        try {
            URL mainURL = new URL(urlPath + name.substring(name.lastIndexOf('.') + 1) + ".class");
            HttpURLConnection conn = (HttpURLConnection) mainURL.openConnection();
            conn.setRequestMethod("GET");

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            BufferedInputStream input = new BufferedInputStream(conn.getInputStream());

            int data;
            while ((data = input.read()) != -1) {
                out.write(data);
            }

            byte[] byteClass = out.toByteArray();
            result = defineClass(name, byteClass, 0, byteClass.length);

        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    return result;
}

您询问了示例类:

package com.server;

public class PluginE {
    public static void main(String[] args) {
        System.out.println("Executing main method of PluginE");

    }
}
 类似资料:
  • 我的Java应用程序包含三个具有依赖项的类文件 我已经使用maven打包了我的应用程序。 POM.xml 下面是我的清单文件内容 当我尝试使用java-jar###. jar执行打包的JAR文件时,我收到了如下错误 上面的错误是指线 打包的 JAR 包含所有必需的类文件。但我仍然面临这个错误。我的回声$CLASSPATH什么都没有。

  • 代码重构后,我在尝试编译Maven项目时遇到以下错误: 我尝试删除文件夹但问题未解决。您知道如何解决此问题吗?

  • 我有任务要做,我有一个问题,我得到了错误。我不知道怎么修理它: 线程“main”java.lang.NullPointerException在test.main(test.java:29)中出现异常

  • 我在线程“main”java中遇到异常。错误:未解析编译。 我做错了什么? 线程“main”中出现异常: java.lang.错误:未解决的编译问题: 对于类型在

  • 我有任务要做,我有一个问题,我得到了错误。我不知道如何修理它: 异常线程"main"java.lang.NullPointerExcema在test.main(test.java:29) 这是我的密码:

  • 线程“main”java中出现异常。错误:为什么我的参数变量不能解析为变量? 我正在尝试创建一个简单的程序,创建people类的两个对象,给它们命名,并使第一个对象(“lisa”)成为第二个对象(“mark”)的朋友,最后在屏幕上显示/打印lisa的朋友。 但Eclipse显示以下错误: 线程“main”java中出现异常。错误:未解决的编译问题:lisa无法解析为变量标记无法解析为变量lisa无