2012-11-28 81 views
2

我想从我的代码中的bin文件夹中使用.class文件 - 将其转换为字节,但不知道如何去它。我有bin/example.class,我需要加载它并检查我的类有多少个字节。从bin文件夹加载班级

我发现是这样的:

public class MyClassLoader extends ClassLoader{ 

     public MyClassLoader(){ 
      super(MyClassLoader.class.getClassLoader()); 
     } 
} 

但它似乎并没有帮助,那一定是一些非常简单的方法来做到这一点。它看起来非常简单,整个互联网试图推动我写出千行的ClassLoader Code。

编辑:我的java文件以编程方式编译和.class文件以编程方式创建,所以我不能只引用它的名称,它也在工作区中的其他位置。

一些提示?

回答

3

只需将bin文件夹添加到您的课程路径!

要获取字节数,请获取资源URL,转换为File对象并查询大小。

例子:

package test; 

import java.io.File; 
import java.net.URISyntaxException; 
import java.net.URL; 

public class Example { 

    public static final String NAME = Example.class.getSimpleName() + ".class"; 

    public static void main(String[] args) throws URISyntaxException { 
     URL url = Example.class.getResource(NAME); 
     long size = new File(url.toURI().getPath()).length(); 
     System.out.printf("The size of file '%s' is %d bytes\n", NAME, size); 
    } 

} 

将输出:

文件的大小 'Example.class' 是1461字节

+0

你意味着构建路径,对吧?我收到错误消息:“项目'Example'中的源文件夹'src'无法输出到不同的源文件夹'bin'” – Doszi89

+1

我假设您使用的是Eclipse?然后,如果在项目创建过程中启用“为源文件和类文件创建单独的文件夹”,则bin文件夹已位于类路径中。我会将示例代码添加到我的答案 – rmuller

+0

非常感谢,但我需要添加 - 我的java文件是以编程方式编译的,而.class文件是以编程方式创建的,所以我无法引用它编写代码 - 因为它没有存在... – Doszi89

1

你可以做这样的事情:

public class MyClassLoader extends ClassLoader { 

    protected synchronized Class<?> loadClass(String name, boolean resolve) 
     throws ClassNotFoundException { 

     try { 
      return super.loadClass(name, resolve); 
     } 
     catch (ClassNotFoundException e) { 

      // TODO: test, if you can load the class with 
      // the given name. if not, rethrow the exception! 

      byte[] b = loadClassData(name); 
      return defineClass(name, b, 0, b.length); 
     } 

    } 

    private byte[] loadClassData(String name) { 
     // TODO: read contents of your file to byte array 
    } 


} 
+0

你能指定如何将我的不存在的类转换为字节数组吗?行“// TODO:读取文件的内容到字节数组”的一些示例请... – Doszi89

+0

使用fileInputStream打开文件,并将其读入字节数组。 – mbelow