从另一个访问私有静态方法



我有一个带有私有静态方法的主类。我想从另一个 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");
    }
}

我想从另一个像这样的 Java 类调用createRandom;

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

然后,Netbeans 显示方法具有专用访问权限。

您不应该从该类外部访问private函数/变量。如果需要访问类的private变量,可以为该变量创建随附的getter,并在类上调用getter函数。

对于函数,

如果您尝试从中访问函数的类位于同一包中,或者与具有函数的类是子类,请将private更改为 protectedprotected允许同一包或子类中的成员访问项目,但不允许访问包外部的任何内容。

关于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方法无法从另一个类访问。如果需要调用它,可以创建另一个在内部调用私有方法的公共方法,或者将访问修饰符更改为公共/受保护/默认。例:

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

为该方法选择合适的访问修饰符,选项包括:publicprotecteddefault(通过不提供修饰符来指示)和private

这里有一个很好的解释:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

如注释中所述,您可以使用public打开它,但是如果您不希望访问如此广泛的访问权限,则可以从default(如果您在同一包中,则允许您访问该方法)或protected(与默认值相同,但也允许子类访问该方法, 如果要扩展类)。

作为一般规则,请坚持使用最严格的权限。以后打开权限更容易,但删除它们非常困难。

您不能在定义此方法的类之外访问私有方法。应将其设置为"公共"以授予对任何类的完全访问权限,或设置为"受保护"以授予对同一包中所有类的访问权限。

点击 [这里] 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

只需将可见性从private更改为public,以便其他实例可以访问它们。私有意味着它仅适用于自己的可用类。

最新更新