Как передать ссылку на закрытый конечный класс

Я хочу передать ссылку частного конечного класса в метод другого класса, пожалуйста, помогите мне. Спасибо

Это класс, который я объявил в отдельном файле класса, и я хочу его использовать.

private final class Mute extends BooleanControl {
        private Mute() {
            super(javax.sound.sampled.BooleanControl.Type.MUTE, false, "True", "False");
        }

В этом методе

public class BaseCameraActivity extends AppCompatActivity {

 protected void onCreateActivity() {

findViewById(R.id.btn_mute).setOnClickListener(v -> {
        //here i want to use the private class mute
    });

Как вам удалось объявить класс верхнего уровня закрытым? Вы проверяли компиляцию кода? ? [подсказка: не будет]

kryger 10.04.2019 15:55

Почему? private означает private. Он не предназначен для использования в других местах. Подумайте о том, чтобы переосмыслить свой дизайн. Или это внешний код, который вы абсолютно не можете изменить? В этом случае вы можете попытаться взломать свой путь, используя отражение. Никогда не думайте об отражении, если вы можете изменить источник.

Zabuzard 10.04.2019 15:55

@Zabuza Привет, это проект с открытым исходным кодом в Github. Я клонирую его в свою IDE, и в защищенном файле объявлено отключение звука частного класса, поэтому я не могу его изменить, и я хочу использовать этот частный класс в методе onCreateActivity(), пожалуйста помощь. Спасибо

Abdullah Nagori 10.04.2019 16:09

Это закрытый класс, что означает, что он должен использоваться в файле/классе, где он объявлен... Только там вы можете сделать Mute mute = new Mute();. Это означает, что вы не можете использовать его в BaseCameraActivity напрямую. Вы можете добавить его туда, но тогда у вас будет избыточность кода немного...

deHaar 10.04.2019 16:11

@JakeJones Как я уже сказал, если это внешний код, и вы не можете его изменить, отражение - единственный способ взломать ваш путь. Обратите внимание, что отражение никогда не является хорошим выбором. Сказав это, взгляните на такие темы, как Доступ к невидимым классам с отражением.

Zabuzard 10.04.2019 16:22

@deHaar Большое спасибо за ваш ответ :) private mute class имя пакета отличается, и где я хочу его использовать, имя пакета отличается. Я также импортирую имя пакета, например import com.sun.media.sound.*;, и все же я не могу получить доступ к классу. Не могли бы вы показать делать код. Спасибо

Abdullah Nagori 10.04.2019 16:56

Привет, @Zabuza Спасибо за сотрудничество, пожалуйста, прочитайте мой комментарий выше, я не могу получить к нему доступ, мой мозг полностью застрял, я не понимаю, как это сделать, не могли бы вы также показать это, выполнив код. Спасибо

Abdullah Nagori 10.04.2019 17:00

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

Zabuzard 10.04.2019 18:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
8
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже говорили другие, частный класс можно использовать только в его файле определения. Должно быть некоторое вхождение new для этого класса, если он вообще используется. Я предполагаю, что в этом файле действительно есть публичный класс (который я называю Container)

Итак, найдите код, который говорит: new Mute() в файле, в котором находится класс Mute. В идеале вы найдете в файле функцию, которая делает что-то вроде:

public BooleanControl createMute() { return new Mute() ; }

BooleanControl (или, возможно, какой-то интерфейс, который реализует сам BooleanControl) является (абстрактной) ссылкой на ваш (конкретный) "Mute" объект, который вы можете использовать и передавать, и который сам по себе не является частным.

то есть в вашем клиентском коде вы получаете:

Container c = new Container();
BooleanControl  bc = c.createMute();
... use bc...

спасибо за ваш ответ, вы правы BooleanControl это public abstract class но все же я не могу им пользоваться пожалуйста помогите. Спасибо

Abdullah Nagori 10.04.2019 17:30

Другие вопросы по теме