Можно ли загрузить класс в Java и «подделать» имя пакета/каноническое имя класса? Я попытался сделать это, очевидно, но я получаю сообщение «имя класса не соответствует» в ClassDefNotFoundException
.Динамическая загрузка класса в java с другим именем пакета
Причина, по которой я делаю это, я пытаюсь загрузить API, который был написан в пакете по умолчанию, поэтому я могу использовать его напрямую, не используя отражение. Код будет скомпилирован против класса в структуре папок, представляющей пакет и импорт имени пакета. то есть:
./com/DefaultPackageClass.class
// ...
import com.DefaultPackageClass;
import java.util.Vector;
// ...
Мой текущий код выглядит следующим образом:
public Class loadClass(String name) throws ClassNotFoundException {
if(!CLASS_NAME.equals(name))
return super.loadClass(name);
try {
URL myUrl = new URL(fileUrl);
URLConnection connection = myUrl.openConnection();
InputStream input = connection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int data = input.read();
while(data != -1){
buffer.write(data);
data = input.read();
}
input.close();
byte[] classData = buffer.toByteArray();
return defineClass(CLASS_NAME,
classData, 0, classData.length);
} catch (MalformedURLException e) {
throw new UndeclaredThrowableException(e);
} catch (IOException e) {
throw new UndeclaredThrowableException(e);
}
}
Нет, у меня нет доступа к источнику. Перемещение классов в каталог не работает во время выполнения, хотя, похоже, оно компилируется. Я бы предпочел не взломать класс, если это возможно. –
Вы говорите, что изменение пакета класса во время выполнения - это не взлом? Для меня вопрос только в том, что хуже хук, а затем использовать другой ... – FelixM