我是Java的新手,我想创建一些在访问时动态计算的类变量,就像使用property()方法在Python中一样。但是,我不确定如何描述这个,所以谷歌搜索向我展示了很多关于Java“Property”类的内容,但这看起来并不是一回事。什么是Python的属性()的Java等价物?
答案 0 :(得分:7)
Java语言中没有这样的工具。你必须自己明确地编写所有的getter和setter。像Eclipse这样的IDE可以为你生成这个样板代码。
例如:
class Point{
private int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
public void setX(int x){
this.x = x;
}
public int getX(){
return x;
}
public void setY(int y){
this.y = y;
}
public int getY(){
return y;
}
}
您可能需要查看Project Lombok,其中提供的注释@Getter
和@Setter
与Python的property
有些相似。
使用Lombok,上面的示例简化为:
class Point{
@Getter @Setter private int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
答案 1 :(得分:3)
内置的property()函数与答案中描述的完全相反。它不是为成员变量生成getter和setter。它只允许您通过访问属性来调用方法(因此,尽管您只是访问Python类中的变量,但将调用一个函数)。 (this post ecplains如何以及为何使用它。)
这就是说,Java不提供这样的东西。更重要的是,在Java中不鼓励属性访问。我想你可以用Groovy脚本语言和元魔术来做到这一点。但我不知道如何做到这一点。
答案 2 :(得分:2)
他们并不存在。在Java中,通常的做法是将成员声明为private
或protected
,并且只允许通过方法访问它们。通常这会导致许多小getFoo()
和setFoo(newFoo)
方法。 Python实际上没有private
和protected
,并且允许直接访问成员更常见。
答案 3 :(得分:1)
正如其他人所说,java有getter和setter,但没有严格的类比。有一个名为Project Lombok的第三方库使用注释在comile时生成.class文件中的getter和setter。这可以用来使事情变得不那么冗长。
答案 4 :(得分:0)
您想在课堂上创建新的字段/ getter / setter吗?如果要在运行时执行此操作,则必须使用字段和方法创建全新的类,并将其加载到JVM中。要创建新类,您可以使用ASM或CGLib之类的库,但如果您是Java新手,那么这不是您想要开始的。
答案 5 :(得分:-1)
实际上,您可以在Java中模拟此行为。
警告:丑陋的解决方案
您可以在实用程序类中编写方法,如下面的代码:
public Object getProperty(String property, Object obj) {
if (obj != null && property != null) {
Field field = obj.getClass().getDeclaredField(property);
field.setAccessible(true);
try {
return field.get(obj);
} catch (Exception ex) {
return null;
}
}
return null;
}
您实际上可以将其声明为静态方法,然后将此方法导入到需要此行为的类中。
顺便说一下,Groovy支持这个功能。