在java中读取.class文件

时间:2011-03-28 07:29:05

标签: java reflection

嗨,有谁可以指导我解决这个问题?

我正在使用 Java反射读取.class文件,该类包含一些其他类参考(外部参考)。但是当我尝试使用Java反射访问/读取其信息时,它将给出

  

找不到符号编译时错误?

有没有办法在读取.class文件的情况下使用Java反射获取类的自定义数据类型(意味着A类得到了B类的引用)?

  1. 我正在使用 ClassLoader
  2. 阅读.class文件
  3. 然后我正在读取文件然后将其传输到字节数组并使用 defineCalss()方法我将获得类对象。
  4. 我将获得信息,即我使用 getDeclaredFields()方法的所有类别的字段。
  5. 当我尝试编译具有外部引用的.java文件时,它会给出“找不到符号错误” &安培;当我使用一些IDE编译它,即eclipse然后尝试打开它的.class文件来读取它然后它给出了这些错误

    线程“main”中的异常java.lang.NoClassDefFoundError:LTeacherClass;     at java.lang.Class.getDeclaredFields0(Native Method)     at java.lang.Class.privateGetDeclaredFields(Unknown Source)     at java.lang.Class.getDeclaredFields(Unknown Source)     在ClassExtractManager.classInfoExtracter(ClassExtractManager.java:158)     在MainClass.main(MainClass.java:36) 引起:java.lang.ClassNotFoundException:TeacherClass     at java.lang.ClassLoader.findClass(Unknown Source)     at java.lang.ClassLoader.loadClass(Unknown Source)     at java.lang.ClassLoader.loadClass(Unknown Source)     ......还有5个

    如果还有问题,我会发布代码。

3 个答案:

答案 0 :(得分:2)

Reflection是一个运行时API,我认为它不会给你一个编译时错误。很可能您的代码存在问题,例如未声明/未导入的类或变量。

我看到两种可能性。

如果您正在编写自己的类加载器或其他在运行时确实需要动态类加载的解决方案,则无法在编译时将其与对具体类或接口未知(未导入)的引用混淆。您必须依赖从开始到结束的反射,或者转换为已知类型(或者更可能是接口,但编译时必须编译器知道这些)。

另一种可能性是你完全滥用反射或类加载。我怀疑你可能有代码读取.class文件,然后尝试按名称使用该类,假设它的工作就像解释了所有内容一样。这意味着你搞乱编译和链接执行。粗略地说,编译器只将TeacherClass之类的符号转换为相关代码(因此它抱怨它不知道TeacherClass是什么)。实际执行代码时,在编译后使用反射。这就是为什么它不会影响编译器。

也许你根本不需要这些?也许你只需要学习Java中的类路径,编译和链接的基础知识?

根据提供的稀缺信息,这只是猜测。

答案 1 :(得分:1)

尝试使用ClassLoader.loadClass(String)从名称中获取类实例。除非你实现自己的ClassLoader,否则这是首选方式......

答案 2 :(得分:1)

您的MyClassLoader必须了解其他引用的类。它们存放在哪里?在使用java反射之前,让您的加载程序读所有这些类

public class ABC {
  public XYZ getXyz() {
  ...
  }
}

public class XYZ {
 ...
}

在上面的示例中,您的类加载器必须先了解XYZ.class才能在ABC.class上使用反射