Доступ к приватному статическому методу из другого

У меня есть основной класс с закрытым статическим методом. Я хочу получить доступ к этому методу из другого класса Java. Я попробовал несколько способов, однако они не работали. Как я могу получить доступ к методу?

ниже основного класса, как это;

public class RandomGenerate {

    public static void main(String[] args) throws Exception {
        System.out.print.ln("main method");
    }

    private static synchronized void createRandom(PersonObj person, int number, List s) {
        System.out.println("deneme");
    }
}

И я хочу позвонить createRandom из другого Java-класса, как это;

public class Deneme {
    RandomGenerate rg = new RandomGenerate();
    RandomGenerate.createRandom(person, number, sList);
}

Затем метод показа netbeans имеет частный доступ.

6 ответов

Вы не должны получить доступ к private функция / переменная извне этого класса. Если вам нужно получить доступ к private переменная класса, вы можете создать сопровождающий getter для этой переменной, и вызвать getter функция на класс.

Для функций, если класс, из которого вы пытаетесь получить доступ к функции, находится в том же пакете или является подклассом класса с функцией, измените private в protected, protected позволяет членам в одном и том же пакете или подклассах получить доступ к элементу, но ничего вне пакета.

Хорошее чтение на видимость в Java это: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Это показывает таблицу:

                  Access Levels

Modifier    Class   Package Subclass    World

public      Y       Y       Y           Y

protected   Y       Y       Y           N

no modifier Y       Y       N           N

private     Y       N       N           N

Прежде всего

Если вам нужно использовать его вне класса, сделайте это public (или же protected если вам это нужно только в подклассах, или по умолчанию [вообще нет ключевого слова], если вам это нужно только в пакете). Если вам нужно использовать его вне класса, и это private и вы не можете сделать это не private Это проблема дизайна, которую вы должны решить.

Но...

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

Но опять же, это обходной путь. Используйте правильный модификатор доступа.

private методы не доступны из другого класса по определению. Если вам нужно вызвать его, вы можете создать другой открытый метод, который внутренне вызывает частный метод, или изменить модификатор доступа на public/protected/default.Example:

private static String secretMethod() { return "secret"; }
public static String knownMethod() { return secretMethod(); }

Вы хотите выбрать правильный модификатор доступа для метода, варианты: public, protected, default (на что указывает не предоставление модификатора), и private,

Хорошее объяснение здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Как уже упоминалось в комментариях, вы можете использовать public чтобы открыть его, но если вы не хотите такой широкий доступ, вы могли бы начать с default (который позволяет вам получить доступ к методу, если вы находитесь в одном пакете), или protected (который аналогичен стандартному, но также позволяет дочерним классам получать доступ к методу, если вы хотите расширить класс).

Как правило, придерживайтесь самого строгого разрешения. Позже открыть разрешения проще, но удалить их очень сложно.

Просто измените видимость с private в public чтобы другие экземпляры могли получить к ним доступ. Частный означает, что это доступно только для собственного класса.

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

Нажмите [здесь] http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html Для получения дополнительной информации.

Если вы действительно хотите получить доступ к приватному методу, вам придется использовать Java Reflection. Смотрите этот пример кода.

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Workspace {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ClassWithPrivateMethod cwpm = new ClassWithPrivateMethod();
        Method m = cwpm.getClass().getDeclaredMethod("privateMethod", String.class);
        m.setAccessible(true); //This is a key statement for accessing private methods
        m.invoke(cwpm, "test");
    }
}

class ClassWithPrivateMethod {
    private void privateMethod(String someParam){
        System.out.println("I am private!!!");
        System.out.println("Parameter: " + someParam);
    }
}

Этот код выведет следующий вывод:

I am private!!!
Parameter: test
Другие вопросы по тегам