Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何限制我的方法的可见性_Java_Methods_Access Modifiers - Fatal编程技术网

Java 如何限制我的方法的可见性

Java 如何限制我的方法的可见性,java,methods,access-modifiers,Java,Methods,Access Modifiers,我现在正在学习Java中的方法/类访问控制,并且在将这个方法设置为public之外的任何东西时遇到了一些问题。理想情况下,我希望TestLib对JavaApplication8不可见,因为程序可以利用TestLib中的方法而不查看源代码。以下是我现在拥有的: TestLib: package testlib; import java.awt.Robot; public class TestLib { private static void moveMouse(int x, int y){

我现在正在学习Java中的方法/类访问控制,并且在将这个方法设置为public之外的任何东西时遇到了一些问题。理想情况下,我希望
TestLib
JavaApplication8
不可见,因为程序可以利用TestLib中的方法而不查看源代码。以下是我现在拥有的:

TestLib:

package testlib;
import java.awt.Robot;
public class TestLib {
    private static void moveMouse(int x, int y){
        try{
            Robot robot = new Robot();
            robot.mouseMove(x, y);
        }catch(Exception e){
            System.out.println("Error");
        }
    }
}
JavaApplication8:

package javaapplication8;

import testlib.TestLib;

public class JavaApplication8 {
    public static void main(String[] args) {
       TestLib.moveMouse(10, 20);
    }
}
除非我将方法设置为public,否则我不允许访问
TestLib.moveMouse(x,y)
,我很确定这是一种不好的做法。我怎样才能避开这件事


谢谢

您希望
moveMouse()
仅在包范围内可见。也就是说,只有同一个包中的方法才能看到
moveMouse()
。为此,请使用
default
修饰符,而不是
public
。因此,该方法现在看起来如下所示:

default static void moveMouse(int x, int y){
    try{
        Robot robot = new Robot();
        robot.mouseMove(x, y);
    }catch(Exception e){
        System.out.println("Error");
    }
}

由于
moveMouse()
位于
package testlib
中,它对
package javaapplication8

不可见,因此在java中不存在
可见性级别
这样的东西,只有
访问级别
。可见性是关于程序员(人)的。您需要编译代码并提供一个JAR。这将允许人们使用代码而不必看到内部细节。但是,所有api都将始终可见

公共、受保护和私有是访问级别。它们控制可使用(不查看)方法的级别

要对最终用户隐藏TestLib的源代码,我要 完成后,将其作为库分发

在这里,中的可见性与此无关

虽然通过jar文件分发,但可以反编译类并获取源代码。有成千上万的反编译器。(例如)。因此,这里您应该使用Java安全性(例如:数字签名JAR等)来保护源代码不受最终用户的影响

以下是从中获取的可见性奖励信息(按程序)

参考资料:

是否要隐藏源代码并禁止执行?我想对最终用户隐藏TestLib的源代码,我想在完成后将其作为库分发。然后将所有允许调用的方法都作为公共方法,并将源代码编译成jar文件,这样用户就可以使用,但他们看不到来源你完全误解了能见度水平;它们与源代码无关。啊,我当时误解了,我的错!使用正确的可见性级别仍然很好,我想,最好现在就把它记下来。如果我收到一个错误,说我的java版本不支持
default
?有没有其他方法可以做到这一点?利用公众视线真的那么糟糕吗?我在开源和封闭源码之间徘徊,所以如果我采用开源,那么将所有方法都作为公共方法在任何方面都是有害的吗?“default”修饰符并不意味着将“default”放在方法前面。这意味着根本不需要修改。两件不同的事情<方法上的代码>默认值只支持Java 8接口中的默认方法。嗯,好吧,所以无论我是开源还是开源,都不会有什么区别,但如果我将库中的所有方法都设置为公共,这是一件坏事吗?@Nathan取决于库中的方法。@user3580294,解释一下?