美文网首页
类的加载(加载.class文件或者jar包中的类)

类的加载(加载.class文件或者jar包中的类)

作者: 背麻袋的袋鼠 | 来源:发表于2018-03-02 10:28 被阅读51次
    加载.class文件方式
    public class MyClassLoader extends ClassLoader{
    
    protected Class<?> findClass(String dir) throws ClassNotFoundException {
        File classFile = new File(dir);
        if(!classFile.exists()){
            throw new ClassNotFoundException(classFile.getPath() + " 不存在") ;
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
        ByteBuffer bf = ByteBuffer.allocate(1024) ;
        FileInputStream fis = null ;
        FileChannel fc = null ;
        try {
            fis = new FileInputStream(classFile) ;
            fc = fis.getChannel() ;
            while(fc.read(bf) > 0){
                bf.flip() ;
                bos.write(bf.array(),0 , bf.limit()) ;
                bf.clear() ;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fis.close() ;
                fc.close() ;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return defineClass(bos.toByteArray() , 0 , bos.toByteArray().length);
     }
    }
    

    =======================================================

           public class Test {
              public static void main(String[] args) throws 
               ClassNotFoundException{
             int i = 0 ;
           System.out.println("开始了");
               while(true){
               MyClassLoader mcl = new MyClassLoader() ;
              System.out.println(mcl.getParent());
             Class<?> personClass =  
              mcl.findClass("D:\\workspace\\ultrasafe-
             mining\\mining\\target\\test.class");
           try {
               Object person =  personClass.newInstance() ;
    
               Method sayHelloMethod = personClass.getMethod("say") ;
               sayHelloMethod.invoke(person) ;
               System.out.println(++i);
    
           } catch (Exception e) {
               e.printStackTrace();
           }
           try {
               Thread.sleep(3000) ;
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
       }
     }
    
    加载jar包的方式
    public static void main(String[] args) throws Exception{
        File file = new File("D:/workspace/ultrasafe-
      mining/mining/target/classes/mysql-connector-java-6.0.5.jar");
        URLClassLoader loader = new URLClassLoader(new URL[]{ file.toURI().toURL() });
        Class clazz = loader.loadClass("com.mysql.cj.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();
        Properties p = new Properties();
        p.put("user", "root");
        p.put("password", "root123");
        Connection conn = 
        driver.connect("jdbc:mysql://192.168.110.16:3306/test?
        useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true
       &useLegacyDatetimeCode=false&serverTimezone=UTC",p);
        System.out.print(conn.toString());
    }
    

    相关文章

      网友评论

          本文标题:类的加载(加载.class文件或者jar包中的类)

          本文链接:https://www.haomeiwen.com/subject/jtwoxftx.html