Чтение .class файла в Java - PullRequest
       0

Чтение .class файла в Java

1 голос
/ 28 марта 2011

Привет, кто-нибудь может мне помочь в этой проблеме?

Я читаю файл .class, используя Отражение Java , и этот класс содержит какой-то другой класс Reference (External References). Но когда япопытаться получить доступ / прочитать информацию, используя отражение Java, тогда она выдаст

Не удается найти символ Ошибка времени компиляции?

Есть ли способполучение пользовательского типа данных (означает, что класс A получил ссылку на класс B) класса с использованием отражения Java в случае чтения файла .class?

  1. Я читаю файл .class с использованием ClassLoader
  2. затем я читаю файл и затем передаю его в байтовый массив и, используя метод defineCalss () , получу объект класса.
  3. После того, как я получу информацию, т.е. все поля класса, я использую метод getDeclaredFields () .

Когда я пытаюсь скомпилировать файл .java, имеющий внешнюю ссылку, тогда ондал "Символ не найден ошибка" & когда я компилируюЭто делается с использованием некоторой IDE, т.е. eclipse. Затем попробуйте открыть свой файл .class, чтобы прочитать его, затем он выдал следующие ошибки

Исключение в потоке "main" java.lang.NoClassDefFoundError: LTeacherClass;в java.lang.Class.getDeclaredFields0 (собственный метод) в java.lang.Class.privateGetDeclaredFields (неизвестный источник) в java.lang.Class.getDeclaredFields (неизвестный источник) в ClassExtractManager.classInfoExtracter (ClassExtractClass8j).main (MainClass.java:36) Причина: java.lang.ClassNotFoundException: TeacherClass в java.lang.ClassLoader.findClass (неизвестный источник) в java.lang.ClassLoader.loadClass (неизвестный источник) в java.lang.ClassLoader.loadClass(Неизвестный источник) ... еще 5

Если проблема не устранена, я отправлю код.

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

Reflection - это API времени выполнения, и я не думаю, что он может дать вам ошибку во время компиляции. Скорее всего, в вашем коде есть проблема, такая как необъявленный / не импортированный класс или переменная.

Я вижу две возможности.

Если вы пишете свой собственный загрузчик классов или любое другое решение, которое действительно требует динамической загрузки классов во время выполнения, вы не можете смешивать его со ссылками на конкретные классы или интерфейсы, неизвестные (не импортированные) во время компиляции. Вы должны полагаться на отражение от начала до конца или приведение к известным типам (или, более вероятно, интерфейсам, но эти должны быть известными компилятору во время компиляции).

Другая возможность состоит в том, что вы неправильно используете рефлексию или загрузку классов. Я подозреваю, что у вас может быть код, который читает файл .class, затем попробуйте позже использовать этот класс по имени, предполагая, что он работает так, как будто все интерпретировано. Это означало бы, что вы испортили компиляцию и связались с исполнением. Грубо говоря, компилятор переводит только символы, такие как TeacherClass, в соответствующий код (и поэтому жалуется, что не знает, что такое TeacherClass). Отражение используется после компиляции, когда вы фактически выполняете код. Вот почему это не влияет на компилятор.

Возможно, вам это вообще не нужно? Может быть, вам просто нужно изучить основы classpath, компиляции и компоновки в Java?

Это всего лишь догадки, основанные на скудной предоставленной информации.

1 голос
/ 28 марта 2011

Ваш MyClassLoader должен знать о других ссылочных классах.Где они хранятся?Сделайте так, чтобы ваш загрузчик прочитал все эти классы до , вы используете отражение Java:

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

public class XYZ {
 ...
}

В приведенном выше примере ваш загрузчик классов должен знать XYZ.class, прежде чем вы сможете использоватьотражение на ABC.class

1 голос
/ 28 марта 2011

Попробуйте использовать ClassLoader.loadClass(String), чтобы получить экземпляр класса по имени.Это предпочтительный способ, если вы не реализуете свой собственный ClassLoader ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...