【问题标题】:How to limit my method visibility如何限制我的方法可见性
【发布时间】:2014-08-21 10:20:33
【问题描述】:

我现在正在学习 Java 中的方法/类访问控制,我在将此方法设置为除公共之外的任何东西时遇到了一些麻烦。理想情况下,我希望TestLibJavaApplication8 不可见,因为程序可以在不查看源代码的情况下使用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);
    }
}

除非我将方法设置为公开,否则我不能访问TestLib.moveMouse(x, y),我很确定这是不好的做法。我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 您想隐藏源代码并禁止执行吗?
  • 我想对最终用户隐藏 TestLib 的源代码,我想在它完成后将它作为库分发。
  • 然后将所有允许调用的方法设为public,并将你的源码编译成jar文件,这样用户就可以使用了,但是他们看不到源码
  • 您完全误解了可见性级别;它们与源代码无关。
  • 啊,我误会了,我的错!我猜使用正确的可见度水平仍然很好,现在最好把它降低

标签: java methods access-modifiers


【解决方案1】:

在java中没有visibility levels这样的东西,只有access levels。可见性是关于程序员(人)的。您需要编译您的代码并提供一个 JAR。这将允许人类使用代码而无需查看内部细节。但是,所有 api 将始终可见。

Public、protected、private 是访问级别。它们控制可以使用(不查看)方法的级别。

【讨论】:

    【解决方案2】:

    您希望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 版本不支持 default 的错误消息怎么办?有不同的方法可以做到这一点吗?使用公共可见性真的那么糟糕吗?我在开源还是闭源之间犹豫不决,所以如果我开源,那么将所有方法都公开是否会以任何方式有害?
    • “default”修饰符并不意味着将“default”放在方法前面。这意味着根本不使用修饰符。两种不同的东西。 default on methods 仅支持 Java 8 接口中的默认方法。
    • 嗯,好吧,所以无论我是开源还是闭源,都不会产生影响,但是如果我将库中的所有方法都设置为公开,那是一件坏事吗?
    • @Nathan 取决于您的库中有哪些方法。
    • @user3580294,解释一下?
    【解决方案3】:

    想对最终用户隐藏 TestLib 的来源,我想 完成后将其作为库分发。

    这里,access modifiers 中的可见性与此无关。

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

    这是来自oracle 的可见性(以编程方式)的奖励信息。

    参考资料: Protect jars from visibility - google

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2011-11-15
      相关资源
      最近更新 更多