以下代码设置私有方法.那私人真的如何私密?
public class Person {
private String name
}
def u = new Person(name:"Ron")
println u.name
Run Code Online (Sandbox Code Playgroud) 所以,我可以在Groovy中声明一个类:
//groovy-code
class Person {
}
Run Code Online (Sandbox Code Playgroud)
这相当于用java写的东西:
//java-code
public class Person {
}
Run Code Online (Sandbox Code Playgroud)
只是出于好奇..在java中编码的groovy相当于:
//java-code
class Person {
}
Run Code Online (Sandbox Code Playgroud)
我的意思是有没有办法通过声明没有访问修饰符的东西来实现我在Java中可以实现的目标?
package com.example.dev;
public class AClass {
private Integer a =10;
...//other code
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的 Spock 方法中访问 a 时:
package com.example.dev;
def 'test a'() {
AClass aClassVar = new AClass()
aClassVar.a = new Integer(100);
...//other testing stuff
}
Run Code Online (Sandbox Code Playgroud)
它工作正常。为什么会发生这种情况?Spock 是否使用反射来访问私有字段?还是我的封装没写好?
我有如下场景,其中有一个World类只有一个私有构造函数和另一个类App。
正如代码所示,一个新的实例World可以创建内部App类,尽管只有私有构造的World。
在Java中是禁止的,我认为在groovy中也是禁止的,但是App运行没有任何错误。
// World.groovy
class World {
private World() {
}
}
// App.groovy
class App {
static void main(String[] args) {
def world = new World()
println world
}
Run Code Online (Sandbox Code Playgroud)
我无法理解在 groovy 中怎么可能。另一个类如何在 groovy 中实例化一个只有私有构造函数的类?
我有一个MyAbstractClass带私有方法的抽象Java类.有一个具体的实施MyConcreteClass.
public class MyAbstractClass {
private void somePrivateMethod();
}
public class MyConcreteClass extends MyAbstractClass {
// implementation details
}
Run Code Online (Sandbox Code Playgroud)
在我的常规测试课中,我有
class MyAbstractClassTest {
void myTestMethod() {
MyAbstractClass mac = new MyConcreteClass()
mac.somePrivateMethod()
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,即somePrivateMethod没有这样的方法签名.我知道groovy可以调用私有方法,但我猜测问题是私有方法是在超类中,而不是MyConcreteClass.有没有办法像这样调用超类中的私有方法(除了使用像PrivateAccessor这样的东西)?
谢谢Jeff