自定义ClassLoader使用问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

自定义ClassLoader使用问题

2016-05-26 17:09:19 2519 2
public class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
    String path = null;
    String[] names = null;
    try {
        path = super.getSystemResource("").getPath();
        names = name.split("/");
        FileUtils.copyFile(new File(name), new File(path+"/"+(getPkgname()+"\\.").replaceAll("\\.", "/")+names[names.length-1]));
    } catch (IOException e) {
        e.printStackTrace();
    }
    String classname = getPkgname()+"."+names[names.length-1].split("\\.")[0];
    return super.getSystemClassLoader().loadClass(classname);
}

private String pkgname;
public String getPkgname() {
    return pkgname;
}
public void setPkgname(String pkgname) {
    this.pkgname = pkgname;
}
}
 public static void main(String[] args) throws SQLException {
        try {
            MyClassLoader my = new MyClassLoader();
            my.setPkgname("test");
            Class c = my.findClass("D:/Test2.class");
            Object o = c.newInstance();
            Method[] methods = c.getDeclaredMethods();
            for (int i = 0; i < methods.length; i++) {
                System.out.println(methods[i].getName());
                methods[i].invoke(o, null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
package test;
public class Test2 {
public void printa(){
    System.out.println("xixi");
}
}

以上分别为自定义类,测试运行类和被加载类。
代码很简单,现在问题是类似这种加载classpath外的绝对路径的类java本身的ClassLoader没有这样的方法吗?然后我这样自定义的Classloader怎么在加载时启动?

取消 提交回答
全部回答(2)
  • 墨少伶
    2019-07-17 19:16:35

    继承一下URLClassLoader,之后这个类就只会加载你指定的url里面的jar包,在应用启动时候加载可以考试试试Thread.setCurrentTreadClassloader(你的classloader实例)

    0 0
  • 蛮大人123
    2019-07-17 19:16:35
    public class NetworkClassLoader extends URLClassLoader {  
      
        String baseUrl;  
      
        public String getBaseUrl() {  
            return baseUrl;  
        }  
      
        public void setBaseUrl(String baseUrl) {  
            this.baseUrl = baseUrl;  
        }  
      
        public NetworkClassLoader(){  
            this(new URL[]{});  
        }  
      
        /** 
         * URL 以'/'结尾的为目录 
         *     否则为jar包 
         *     未指定其父类加载器为系统类加载器 
         * @param urls 
         */  
        public NetworkClassLoader(URL[] urls) {  
            super(urls);  
        }  
        /** 
         * 同上,指定classLoader 
         * @param urls 
         * @param parent 
         */  
        public NetworkClassLoader(URL[] urls, ClassLoader parent) {  
            super(urls,parent);  
        }  
        /** 
         * 同上,URL工厂处理器 
         * @param urls 
         * @param parent 
         * @param factory 
         */  
        public NetworkClassLoader(URL[] urls, ClassLoader parent,  
                  URLStreamHandlerFactory factory) {  
             super(urls,parent,factory);  
        }  
      
        /** 
         * [添加baseUrl] 
         * @param url 
         */  
        public void addURL(String url){  
            URL uurl=null;  
            try {  
                uurl = new URL(baseUrl+url);  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            addURL(uurl);  
        }  
      
        /** 
         * 添加url[添加baseUrl] 
         */  
        protected void addURL(URL url) {  
            super.addURL(url);  
        }  
      
        /** 
         * 返回urls 
         */  
        public URL[] getURLs() {  
            return super.getURLs();  
        }  
      
        /** 
         * 查找类对象 
         *   从以上的URLS中查找加载当前类对象[会打开所有的jars去查找指定的类] 
         *   (可以通过调用findClass来得到以上URL加载包中的类) 
         */  
        protected Class<?> findClass(String name) throws ClassNotFoundException {  
            return super.findClass(name);  
        }  
        /** 
         * defineClass SecureClassLoader定义为最终方法,不允许更改. 
         * 在使用这个类对象前,必须先resolved(解析) 
         */  
        /** 
         * 查找资源[自定义相对URL查找路径] 
         *   从以上的URLS中查找当前名称的资源 
         * 这个必须重写,因为是public 哈哈 
         */  
        public URL findResource(String name) {  
            URL url = null;  
            try {  
                url = new URL(baseUrl+name);  
            } catch (MalformedURLException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            return url;  
        }  
      
        /** 
         * 查找资源列表[URL查找路径] 
         */  
        public Enumeration<URL> findResources(String name) throws IOException {  
            return super.findResources(name);  
        }  
      
        /** 
         * 在当前的ClassLoader中,定义一个新的Package,Package的属性由Manifest指定.这个包的源文件 
         */  
        protected Package definePackage(String name, Manifest man, URL url)  
                throws IllegalArgumentException {  
            return super.definePackage(name, man, url);  
        }  
      
        /** 
         * 加载路径权限 
         */  
        protected PermissionCollection getPermissions(CodeSource codesource) {  
            return super.getPermissions(codesource);  
        }  
    }  

    以下是用法:

    NetworkClassLoader loader = new NetworkClassLoader();  
        loader.setBaseUrl("file:///F:\\框架\\maven\\app\\jms\\src\\main\\webapp\\modules\\");  
      
        loader.addURL("App/lib/test.jar");  
        loader.addURL("App/lib/test1.jar");  
        loader.addURL("App/template/view.vm");  
        loader.addURL("App/config.xml");  
    0 0
添加回答
相关问答

1

回答

自定义镜像 数据盘怎么办

2017-12-25 17:17:04 910浏览量 回答数 1

1

回答

使用自定义镜像问题?

2018-09-26 15:02:06 665浏览量 回答数 1

4

回答

是否可以跨地域使用自定义镜像?

2017-12-06 16:46:12 5164浏览量 回答数 4

1

回答

自定义镜像怎么使用

2015-01-29 07:22:57 5026浏览量 回答数 1

0

回答

如何使用ECS快照创建自定义镜像

2017-10-18 13:54:51 3289浏览量 回答数 0

1

回答

自定义镜像问题

2017-11-21 16:47:21 2052浏览量 回答数 1

2

回答

使用钉钉自定义机器人markdown类型不能@指定人,@人无效,有碰到同样问题的人吗?

2019-11-07 10:32:11 2408浏览量 回答数 2

1

回答

urllib中自定义opener的命令是什么?

2021-11-15 22:23:29 172浏览量 回答数 1

1

回答

怎么在缩略图中进行自定义内容呀?

2022-03-28 17:22:49 224浏览量 回答数 1

1

回答

这个header透传是啥原理,应用需要改动传递traceId不?

2022-08-15 15:39:42 487浏览量 回答数 1
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
文章
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载