lwd8805 2017-06-22 08:22 采纳率: 33.3%
浏览 1041

java 动态加载class问题

java 动态加载class;写了A B类,都没有main方法。其中 A类中有静态方法f,其功能是动态加载类B的class文件。类B中有个函数;在idea中运行是没问题的 A.T.sum(2,7)) 可以调用。但是一旦把这个程序打成jar包后。在其他工程里引入jar包,就不能动态加载该类B。请大神指导下

package fff.BB;

/**

  • Created by ***** on 2017/6/22. */ public class B { public int sum(int x, int y){ return x+y; } }

import fff.BB.B;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;

/**

  • Created by liweidong on 2017/6/22.
    */
    public class A {
    public static B T = null;
    static {
    registerReset();
    }
    private static void registerReset(){
    Set> classSet = loadClass();
    for(Class cl : classSet){
    try {
    T = (B) cl.newInstance();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    private static Set> loadClass(){
    String packageDir = "fff.BB";
    Set> classSet = new LinkedHashSet>();
    try {
    Enumeration dirs = Thread.currentThread().getContextClassLoader().getResources(packageDir.replace('.','/'));
    while (dirs.hasMoreElements()){
    URL url = dirs.nextElement();
    String packagePath = URLDecoder.decode(url.getFile(),"UTF-8");
    Class<?> loadClass = findClass(packageDir,packagePath);
    if(loadClass != null){
    classSet.add(loadClass);
    }
    }
    }catch (IOException e){

    }
    return classSet;
    

    }

    private static Class<?> findClass(String packageName,String packagePath){
    File dir = new File(packagePath);
    if(!dir.exists() || !dir.isDirectory()){
    return null;
    }

    File[] dirfiles = dir.listFiles(file -> (file.getName().endsWith(".class")));
    
    for(File file : dirfiles){
        String className = file.getName().substring(0, file.getName().length() - ".class".length());
        Class<?> clazz = null;
        try {
            clazz = Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className);
            if(clazz != null){
                return clazz;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    
    }
    return null;
    

    }
    }

  • 写回答

3条回答 默认 最新

  • Irvin-bin 2017-06-22 09:04
    关注

    考虑下打包成jar后路径问题

    评论

报告相同问题?

悬赏问题

  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏