def j_string(loader: ClassLoader, python_str): """ 根据python字符串返回相应的Java字符串实例 :param loader: :param python_str: :return: """ # 如果Java字符串已经在池中,直接返回 interned_str = interned_strings.get(python_str) if interned_str: return interned_str # 把python字符串(utf-8格式)转成Java字符数组(utf-16格式) chars = string_to_utf16(python_str) # 创建一个Java字符串实例 j_chars = Object(loader.load_class("[C"), chars) # 把字符串实例的value变量设置成刚刚转换过来的字符数组 j_str = loader.load_class("java/lang/String").new_object() j_str.set_ref_var("value", "[C", j_chars) # 把Java字符串放入池中 interned_strings[python_str] = j_str return j_str
def start_JVM(cmd): class_path = Classpath.parse(cmd.XjreOption, cmd.cpOption) print("classpath:{0} class:{1} args:{2}".format(class_path, cmd.class_name, cmd.args)) class_loader = ClassLoader(class_path, cmd.verbose_class_flag) class_name = cmd.class_name.replace(".", "/") main_class = class_loader.load_class(class_name) main_method = main_class.get_main_method() if main_method: Interpreter.interpret(main_method, cmd.verbose_inst_flag) else: print("Main method not found in class {0}".format(cmd.class_name))