Я хочу передать ссылку частного конечного класса в метод другого класса, пожалуйста, помогите мне. Спасибо
Это класс, который я объявил в отдельном файле класса, и я хочу его использовать.
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
});
Почему? private
означает private
. Он не предназначен для использования в других местах. Подумайте о том, чтобы переосмыслить свой дизайн. Или это внешний код, который вы абсолютно не можете изменить? В этом случае вы можете попытаться взломать свой путь, используя отражение. Никогда не думайте об отражении, если вы можете изменить источник.
@Zabuza Привет, это проект с открытым исходным кодом в Github. Я клонирую его в свою IDE, и в защищенном файле объявлено отключение звука частного класса, поэтому я не могу его изменить, и я хочу использовать этот частный класс в методе onCreateActivity(), пожалуйста помощь. Спасибо
Это закрытый класс, что означает, что он должен использоваться в файле/классе, где он объявлен... Только там вы можете сделать Mute mute = new Mute();
. Это означает, что вы не можете использовать его в BaseCameraActivity
напрямую. Вы можете добавить его туда, но тогда у вас будет избыточность кода немного...
@JakeJones Как я уже сказал, если это внешний код, и вы не можете его изменить, отражение - единственный способ взломать ваш путь. Обратите внимание, что отражение никогда не является хорошим выбором. Сказав это, взгляните на такие темы, как Доступ к невидимым классам с отражением.
@deHaar Большое спасибо за ваш ответ :) private mute class
имя пакета отличается, и где я хочу его использовать, имя пакета отличается. Я также импортирую имя пакета, например import com.sun.media.sound.*;
, и все же я не могу получить доступ к классу. Не могли бы вы показать делать код. Спасибо
Привет, @Zabuza Спасибо за сотрудничество, пожалуйста, прочитайте мой комментарий выше, я не могу получить к нему доступ, мой мозг полностью застрял, я не понимаю, как это сделать, не могли бы вы также показать это, выполнив код. Спасибо
Если вы не можете опубликовать минимальный воспроизводимый пример (с акцентом на завершение), чтобы объяснить свою проблему таким образом, чтобы кто-то мог полностью ответить на нее без обсуждения, то этот сайт, вероятно, не подходит для вашего вопроса. Из-за этого вполне вероятно, что он будет закрыт и проголосован против, пожалуйста, прочитайте Как спросить.
Как уже говорили другие, частный класс можно использовать только в его файле определения. Должно быть некоторое вхождение 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
но все же я не могу им пользоваться пожалуйста помогите. Спасибо
Как вам удалось объявить класс верхнего уровня закрытым? Вы проверяли компиляцию кода? ? [подсказка: не будет]