不懂人情世故 2021-07-11 16:24 采纳率: 33.3%
浏览 17
已结题

类加载器,Junit,Main

package com.study.ming.classloader;

import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class MyClassLoader3 extends ClassLoader{
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            byte[] result = getClassFromCustomPath(name);
            if (result == null) {
                throw new FileNotFoundException(name);
            } else {
                // defineClass方法将字节码转化为类
                System.out.println(name);
                return defineClass(name, result, 0, result.length);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        throw new ClassNotFoundException(name);
    }

    private byte[] getClassFromCustomPath(String name) {
        // 从自定义路径中加载指定类,返回类的字节码文件
        InputStream in = null;
        ByteArrayOutputStream out = null;
        String path = "d:\\JavaEngineer.class";
        try {
            in = new FileInputStream(path);
            out = new ByteArrayOutputStream();
            byte[] buffer = new byte[2048];
            int len = 0;
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            return out.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    @Test
    public void sdfdef()  {
        try{
            MyClassLoader3 mcl = new MyClassLoader3();
            Class<?> clazz = Class.forName("com.study.ming.model.JavaEngineer", true, mcl);
            System.out.println(clazz.getClassLoader());//打印出我们的自定义类加载器
            Object obj = clazz.newInstance();

            System.out.println(obj);
            System.out.println(obj.getClass().getClassLoader());//打印出我们的自定义类加载器
        }catch(Exception e){

        }
    }
    public static void main(String[] args) {
        try{
            MyClassLoader3 mcl = new MyClassLoader3();
            Class<?> clazz = Class.forName("com.study.ming.model.JavaEngineer", true, mcl);
            System.out.println(clazz.getClassLoader());//打印出我们的自定义类加载器
            Object obj = clazz.newInstance();

            System.out.println(obj);
            System.out.println(obj.getClass().getClassLoader());//打印出我们的自定义类加载器
        }catch(Exception e){

        }
    }

}

最近在研究类加载器方面的问题,自己照网络上资料写了一个自定义类加载器,但是同样的代码我运行main方法 结果 与 运行Junit方法不一样
我是在项目路径 d://xxx/com/study/ming/model 目录下执行javac JavaEngineer.java生成class文件拷贝到d盘目录, 代码中路径直接写死在d盘了 传到自定义类加载器中的
main方法结果:
com.study.ming.model.JavaEngineer
com.study.ming.classloader.MyClassLoader3@7a07c5b4
JavaEngineer{jeid=0, jename='null'}
com.study.ming.classloader.MyClassLoader3@7a07c5b4

junit方法结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
JavaEngineer{jeid=0, jename='null'}
sun.misc.Launcher$AppClassLoader@18b4aac2

package com.study.ming.model;

import java.text.CollationKey;
import java.text.Collator;

public class JavaEngineer implements Comparable<JavaEngineer>{
    private int jeid;
    private String jename;

    public JavaEngineer(int jeid, String jename) {
        this.jeid = jeid;
        this.jename = jename;
    }

    public JavaEngineer() {
    }

    @Override
    public int compareTo(JavaEngineer o) {
        int a = this.jeid-o.getJeid();
        if(a!=0){
            return a;
        }else{
            final CollationKey collationKey = Collator.getInstance().getCollationKey(this.jename);
            final CollationKey collationKey1 = Collator.getInstance().getCollationKey(o.getJename());
            return collationKey.compareTo(collationKey1);
        }
    }
    public int getJeid() {
        return jeid;
    }

    public void setJeid(int jeid) {
        this.jeid = jeid;
    }

    public String getJename() {
        return jename;
    }

    public void setJename(String jename) {
        this.jename = jename;
    }

    @Override
    public String toString() {
        return "JavaEngineer{" +
                "jeid=" + jeid +
                ", jename='" + jename + '\'' +
                '}';
    }
}

是不是junit方法运行之前干了一些事呢?

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-07-14 14:09
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

    ​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月9日
  • 修改了问题 7月11日
  • 创建了问题 7月11日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度