Questions tagged «access-modifiers»

访问修饰符是OOP概念。它确定特定属性/方法/类具有什么级别的访问权限或可见性。



7
私有方法真的安全吗?
在Java中,private访问修饰符被认为是安全的,因为它在类外部不可见。然后外面的世界也不知道这种方法。 但是我认为Java反射可以用来打破这一规则。考虑以下情况: public class ProtectedPrivacy{ private String getInfo(){ return "confidential"; } } 现在从另一堂课我将获得信息: public class BreakPrivacy{ public static void main(String[] args) throws Exception { ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy(); Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null); method.setAccessible(true); Object result = method.invoke(protectedPrivacy); System.out.println(result.toString()); } } 这时我只是觉得私有方法仍然安全,因为要做上面的事情我们必须知道方法名称。但是,如果类包含由其他人编写的私有方法,那么我们将看不到那些。 但是,由于下面的代码行,我的观点变得无效。 Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods(); 现在,它method[]包含了需要做的所有事情。我的问题是,有没有一种方法可以避免使用Java反射做这种事情? …

2
由于“内部”保护级别,无法访问初始化程序
我有一些协议 登录策略 public protocol LoginStrategy { func login(_ viewController: UIViewController) func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) func getUserId() -> String } 和两个类: LoginProvider public class LoginProvider { public let strategy: LoginStrategy public func login(_ …

5
Java中的静态块未执行
class Test { public static void main(String arg[]) { System.out.println("**MAIN METHOD"); System.out.println(Mno.VAL); // SOP(9090); System.out.println(Mno.VAL + 100); // SOP(9190); } } class Mno { final static int VAL = 9090; static { System.out.println("**STATIC BLOCK OF Mno\t: " + VAL); } } 我知道static在加载类时执行了一个块。但是在这种情况下,类内的实例变量Mno为final,因为该static块未执行。 为什么呢?如果我删除final,它会正常工作吗? 首先分配哪个内存,static final变量还是static块? 如果由于final访问修饰符而无法加载该类,那么该变量如何获取内存?

13
为什么我的接口成员不能受保护?
反对在接口上声明保护访问成员的论点是什么?例如,这是无效的: public interface IOrange { public OrangePeel Peel { get; } protected OrangePips Seeds { get; } } 在此示例中,接口IOrange将保证实现者至少OrangePips为其继承者提供一个实例。如果实现者愿意,他们可以将范围扩大到完整public: public class NavelOrange : IOrange { public OrangePeel Peel { get { return new OrangePeel(); } } protected OrangePips Seeds { get { return null; } } } public class ValenciaOrange …


5
内部班的公开和内部成员?
好的,所以这可能是一个愚蠢的问题,并且肯定有很明显的答案,但是我很好奇我是否错过了这里的任何细微之处。 public在internal类中internal声明的成员与在类中声明的成员之间在可见性/可用性方面是否有区别internal? 即之间 internal class Foo { public void Bar() { } } 和 internal class Foo { internal void Bar() { } } 如果将方法声明为public和并且virtual,然后在派生类中覆盖它,则public使用此修饰符的原因很明显。但是,这是唯一的情况吗...我还缺少其他东西吗?

1
Dim,Global,Public和Private作为模块化现场访问修饰符有什么区别?
在VB6 / VBA中,可以在特定方法Sub或Function方法之外声明模块级变量。我已经在模块中使用过Private并且Public之前了解过它们,如下所示: Public -对模块内部的所有代码和模块外部的所有代码可见,从而使它成为全局代码。 Private -仅对模块内部的代码可见。 我注意到您可以使用Dim和Global作为模块化变量的修饰符。是Dim与Global从不同Private,并Public分别作为模块化领域访问修饰符使用时?如果是这样,它们有何不同?

3
(C#7.2)“私有保护”修饰符的用例是什么?
C#7.2引入了private protected修饰符。 我一直使用属性来保护对字段的访问,允许通过Get / Set方法进行访问,因为我通常不希望通过自己的类以外的任何东西来修改对象的内部状态。 我试图理解为什么C#语言团队添加了此功能。在Google上进行了广泛的搜索之后,阅读并观看了“新消息”媒体(我已经看过Mads Torgerson的新闻稿,详细信息和视频),但我仍然不是一个明智的选择。 在我看来,这似乎使开发人员可以打破Liskov替代原则,但这可能是因为我不理解为什么现在存在此功能。 我知道如何使用它,而不是为什么-请有人可以提供真实的用法示例,而不是MSDN文档中人为的示例吗?

1
非公共类型的公共别名
我想知道它是否有效的C ++: class Test { struct PrivateInner { PrivateInner(std::string const &str) { std::cout << str << "\n"; } }; public: using PublicInner = PrivateInner; }; //Test::PrivateInner priv("Hello world"); // Ok, private so we can't use that Test::PublicInner publ("Hello World"); // ?, by using public alias we can access private type, …

1
与类访问修饰符相比,限制较少的成员访问修饰符有什么用?
假设我有一个包含一些成员的类,并且这些成员的限制访问修饰符比类本身少。 一个具体的例子可能是: package apples; class A { // package private public int foo() { // public (=> less restrictive than *package private*) return 42; } } 据我了解,与成员访问修饰符相比,限制更严格的类访问修饰符将覆盖限制性较小的成员访问修饰符。因此,限制较少的成员访问修饰符应该完全无效。 我的理解正确吗? 如果没有,后果是什么? 限制成员访问修饰符较少的正当理由是什么? 最后,有什么最佳实践可遵循? 我也做了一些试验,因为我认为一旦开始传递函数引用,它可能会产生后果,但是即使那样,访问修饰符似乎也没有关系。 我构造的情况如下: apples.B提供一个bla()返回对的引用的公共方法apples.A.foo。 然后pizzas.C调用apples.B.bla获取A.foo对它的引用并对其进行调用。 因此对A.foo()不能直接看到C,而只能通过间接访问B.bla() 我已经对其进行了测试,并且无论是否将foo() 包的访问修饰符设置为私有都不会有任何区别。 package apples; import java.util.function.IntSupplier; public class B { public IntSupplier getReferenceToAFoo() { …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.