Принудительно создать подкласс класса Java с помощью конструктора, приватного для пакета.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Принудительно создать подкласс класса Java с помощью конструктора, приватного для пакета.

Сообщение Anonymous »

Я хочу принудительно сделать класс в другой библиотеке открытым для подкласса. Сам класс является общедоступным, но его единственный конструктор является частным для пакета. Я уже изучал создание класса с байт-кодом для открытия конструктора и выполнения вызова super(). В JASM (супер круто) класс выглядит так:

Код: Выделить всё

public class com/internal/OpenChild
extends com/external/Parent
{
public ()V {
try {
ldc com/external/Parent
iconst 1
anewarray java/lang/Class
invokevirtual java/lang/Class.getDeclaredConstructor([java/lang/Class)java/lang/reflect/Constructor
iconst 1
invokevirtual java/lang/reflect/Constructor.setAccessible(Z)V
} catch (java/lang/Throwable) {
astore 0
new java/lang/RuntimeException
dup
aload 0
invokespecial java/lang/RuntimeException.(java/lang/Throwable)V
athrow
}
aload 0
invokespecial com/external/Parent.()V
return
}
}
Этот класс com.internal.OpenChild расширяет com.external.Parent. Его общедоступный конструктор без аргументов делает доступным его частный конструктор без аргументов, а затем вызывает вызов super. Эквивалент Java может выглядеть примерно так:

Код: Выделить всё

package com.internal;

import com.external.Parent;

public class OpenChild extends Parent {
public OpenChild() {
try {
Parent.class.getDeclaredConstructor().setAccessible(true);
} catch (Throwable t) {
throw new RuntimeException(t);
}
super();
}
}
Хотя отражение работает нормально, супервызов завершается с ошибкой IllegalAccessException. Думаю, у меня еще есть надежда — в конце концов, можно использовать отражение для создания экземпляра com.external.Parent. Чего мне не хватает в моей стратегии? Неужели нельзя все-таки вызвать такую ​​черную магию?


Подробнее здесь: https://stackoverflow.com/questions/782 ... onstructor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»