如何在java类中扩展jython类

时间:2014-06-03 02:22:47

标签: java jython

我想在java类中扩展一个jython类

public class JavaClass extends JythonClass

如何导入Jython类?它必须编译吗?文档链接已经很有用了。

示例:

class JythonClass(threading.Thread):
def do(self):
    print("hallo")

-

public class JavaClass extends JythonClass
{
    public void hello()
    { System.out.print("hallo")}
}

2 个答案:

答案 0 :(得分:9)

您可以使用Java扩展Jython类,以便通过创建扩展Java“子类”和Jython“超类”的Jython类,使结果在Jython 中可用。假设你有这个Jython类:

class JythonClass(object):
    def get_message(self):
        return 'hello'
    def print_message(self):
        print self.get_message()

您可以部分创建Java类,而无需扩展任何内容:

public class JavaClass {
    private String message;
    public String get_message() {
        return message;
    }
    protected JavaClass(String message) {
        this.message = message;
    }
}

然后在Jython中引起“扩展”关系:

from javapackage import JavaClass as _JavaClass
from jythonpackage import JythonClass

class JavaClass(_JavaClass, JythonClass):
    pass

现在这将有效:

obj = JavaClass('goodbye')
obj.print_message()

如果你希望用Java扩展一个Jython类,并像普通的Java类一样使用它,最简单的方法就是使用组合而不是继承:

  • 为Jython类
  • 上的方法创建Java接口
  • 让你的Jython类扩展Java接口(通过直接修改你的Jython类代码,或者像我上面解释的那样)
  • 创建Java子类作为实现接口,将Jython“superclass”的实例作为私有字段
  • 您希望覆盖的Java子类中的任何方法,只需在私有Jython实例上调用该方法

答案 1 :(得分:2)

我认为Ch10 of The Definitive Guide to Jython

涵盖了这一点

在此示例中,作者使用接口BuildingType,可以将其更改为抽象类

public abstract class BuildingType {
 public abstract String getBuildingName();
 public abstract String getBuildingAddress();
 public abstract String getBuildingId();

 @Override
 public String toString(){
   return "Abstract Building Info: " +
     getBuildingId() + " " +
     getBuildingName() + " " +
     getBuildingAddress();
  }
}

您可以使用自己的方法进行扩展,在这种情况下,我添加了toString()并将其用于' print'而不是作者的原始代码:

public class Main {

  private static void print(BuildingType building) {
      System.out.println(building.toString());
  }

  public static void main(String[] args) {
      BuildingFactory factory = new BuildingFactory();
      BuildingType building1  =  factory.create("BUILDING-A", "100 WEST MAIN", "1")
      print(building1);
      BuildingType building2 = factory.create("BUILDING-B", "110 WEST MAIN", "2");
      print(building2);
      BuildingType building3 = factory.create("BUILDING-C", "120 WEST MAIN", "3");
      print(building3);
  }

}

您可以使用Jython权威指南CH10中的代码复制此代码,并且所有功劳都必须归功于作者 - 我只将Interface更改为Abstract

您还要考虑在界面中使用Java 7 Default方法