Java如何将一个类从另一个jar加载到我的jar以及如何使用它

Java如何将一个类从另一个jar加载到我的jar以及如何使用它,java,class,jar,Java,Class,Jar,//更新// 现在我可以加载一个Jar,但是如何从它运行方法呢 使用jar的文件url创建一个类加载器 让类加载器按名称加载游戏的主类 创建游戏主类的新实例 将其投射到插件加载器知道的“游戏”界面 调用界面上的方法来启动游戏 从需要插入的主JAR文件games.JAR: URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray); 首先获取games.jar文件的URL(使用file.toURI().toURL()

//更新//

现在我可以加载一个Jar,但是如何从它运行方法呢

  • 使用jar的文件url创建一个类加载器
  • 让类加载器按名称加载游戏的主类
  • 创建游戏主类的新实例
  • 将其投射到插件加载器知道的“游戏”界面
  • 调用界面上的方法来启动游戏

  • 从需要插入的主JAR文件
    games.JAR

    URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray);
    
    • 首先获取
      games.jar
      文件的URL(使用
      file.toURI().toURL()
      )并将其放入数组中(让我们调用数组
      urlArray
    • 接下来获取一个
      URLClassLoader
      实例来加载
      games.jar

      URLClassLoader urlClassLoader = URLClassLoader.newInstance(urlArray);
      
    • 现在,如果将刚刚创建的新类加载器作为第三个参数传递,则可以使用
      class.forName
      实例化
      games.jar
      中的任何类:

      Class<? extends Main> mainClass = (Class<? extends Main>)
      Class.forName("Main", true, urlClassLoader);
      

      Class这有两个部分。首先,您需要导入jar。这可以在运行时使用以下方法完成:

      现在,您可以在运行时导入jar。如果您只是拥有jar的路径,那么可以轻松地将其转换为:

      其次,您需要找到jar中定义的类。似乎没有一种内置的方法来实现这一点,因此您必须手动检查jar本身的类

      import java.lang.Class;
      import java.util.ArrayList;
      import java.util.Enumeration;
      import java.util.jar.JarFile;
      import java.util.jar.JarEntry;
      
      public List>classes=new ArrayList cls=Class.forName(name);
      类别。添加(cls);
      }
      }
      返回类;
      }
      
      最后,您可以迭代这些类,以确定它们中是否有任何一个实现了所需的接口

      File jarFile = new File("path/to/Games.jar");
      importJar(jarFile);
      List<Class<?>> classes = findJarClasses(jarFile);
      for (Class<?> cls : classes) {
          if (cls.isInstance(YourInterface.class)) {
              // Instantiate class.
              YearInterface obj = (YourInterface)cls.newInstance();
              // Call `loaded()` method.
              obj.loaded();
          }
      }
      
      File jarFile=新文件(“path/to/Games.jar”);
      导入jar(jarFile);
      
      列表您必须实现自定义类装入器,我如何实现??你能给出示例代码吗?我认为搜索java创建自定义类加载器并不难。无论如何:你能举个例子吗?然后我如何从这些类运行代码?Class.forName()返回一个类对象。在此对象上调用newInstance()以获取类的实例,您可以调用它的任何方法。好的,那么您可以帮助我吗?我有一个装有加载器的Jar,在第二个Jar中,我有一个我想从第一个Jar运行的方法,我要做什么?我编辑了答案。希望它更清楚。只需按照步骤操作。我如何在这个类中运行方法?如果构造函数有参数,可以使用
      cls.newInstance()
      cls.getConstructor(ArgumentClasses…).newInstance(arguments)
      实例化该类。另请参阅我的更新。我总是收到一个错误[11:35:29错误]:启用Arcade v0.1时出错(是否为最新版本?)java.lang.NoClassDefFoundError:Arcade/interfaces/game@sentostv我不熟悉那个错误。也许您可以将所有JAR添加到类路径中,并省略
      importJar()
      调用。好的,您能帮我吗?我有一个装有加载器的Jar,在第二个Jar中我有一个方法,我想从第一个Jar开始运行,我要做什么?
      import java.lang.Class;
      import java.util.ArrayList;
      import java.util.Enumeration;
      import java.util.jar.JarFile;
      import java.util.jar.JarEntry;
      
      public List<Class<?>> findJarClasses(File file) {
          ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
          JarFile jar = new JarFile(file);
          Enumeration<JarEntry> entries = jar.entries();
          while (entries.hasMoreElements()) {
              JarEntry entry = entries.nextElement();
              String name = entry.getName();
              if (name.endsWith(".class")) {
                  name = name.substring(0, name.lastIndexOf('.'));
                  Class<?> cls = Class.forName(name);
                  classes.add(cls);
              }
          }
          return classes;
      }
      
      File jarFile = new File("path/to/Games.jar");
      importJar(jarFile);
      List<Class<?>> classes = findJarClasses(jarFile);
      for (Class<?> cls : classes) {
          if (cls.isInstance(YourInterface.class)) {
              // Instantiate class.
              YearInterface obj = (YourInterface)cls.newInstance();
              // Call `loaded()` method.
              obj.loaded();
          }
      }