我有一个带有私有静态方法的主类。我想从另一个 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
更改为 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
方法无法从另一个类访问。如果需要调用它,可以创建另一个在内部调用私有方法的公共方法,或者将访问修饰符更改为公共/受保护/默认。例:
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
(与默认值相同,但也允许子类访问该方法, 如果要扩展类)。
作为一般规则,请坚持使用最严格的权限。以后打开权限更容易,但删除它们非常困难。
您不能在定义此方法的类之外访问私有方法。应将其设置为"公共"以授予对任何类的完全访问权限,或设置为"受保护"以授予对同一包中所有类的访问权限。
点击 [这里] 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
,以便其他实例可以访问它们。私有意味着它仅适用于自己的可用类。