我有一个私有静态方法的主类。我想从另一个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显示方法具有私有访问权。
答案 0 :(得分:8)
您不应该从该类外部访问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
答案 1 :(得分:4)
如果您需要在课外使用它,请将其设为public
(或protected
如果您只在子类中使用它,或者默认情况下[根本没有关键字]如果您需要它包裹)。如果你需要在课堂外使用它private
并且你不能使它private
,那么你应该解决这个设计问题。
...你可以使用反射(tutorial,docs)解决它,它允许你获取方法并调用它,即使它是私有的。拥有Method
对象后,您必须在致电之前致电setAccessible
至true
。
但同样,这是一种解决方法。使用正确的访问修饰符。
答案 2 :(得分:2)
private
个方法。如果需要调用它,可以创建另一个公共方法,在内部调用私有方法或将访问修饰符更改为public / protected / default。例如:
private static String secretMethod() { return "secret"; }
public static String knownMethod() { return secretMethod(); }
答案 3 :(得分:0)
您需要为该方法选择正确的访问修饰符,选项包括:public
,protected
,default
(通过不提供修饰符表示),以及{ {1}}。
这里有一个很好的解释:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
正如评论中所提到的,您可以使用private
进行打开,但如果您不想进行如此广泛的访问,则可以从public
开始(允许您访问方法,如果你在同一个包中),或default
(与默认值相同,但如果你想扩展类,也允许子类访问该方法)。
作为一般规则,坚持使用最严格的权限。以后更容易打开权限,但很难将其删除。
答案 4 :(得分:0)
只需将可见性从private
更改为public
,以便其他实例可以访问它们。私人意味着它只适用于自己的班级。
答案 5 :(得分:0)
您无法访问定义此方法的类之外的私有方法。您应该将其设置为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