def get_class(self, class_name): """ Returns initialized class from pool (perm_gen) or loads it with class loader (and running static constructor). Getting a class might result in loading it's super first. :param class_name: :return: """ if class_name is None: return # this is look up for Object's super, which is None if class_name in self.perm_gen: return self.perm_gen[class_name] if class_name[0] == '[': # special treatment for arrays java_class = array_class_factory(self, class_name) lang_clazz = self.get_class("java/lang/Class") clazz_object = lang_clazz.get_instance(self) clazz_object.fields["@CLASS_NAME"] = class_name ref = self.add_to_heap(clazz_object) java_class.heap_ref = ref self.perm_gen[class_name] = java_class return java_class if class_name in [ 'byte', 'char', 'double', 'float', 'int', 'long', 'short', 'boolean' ]: java_class = JavaClass() self.perm_gen[class_name] = java_class java_class.is_primitive = True java_class.this_name = class_name lang_clazz = self.get_class("java/lang/Class") clazz_object = lang_clazz.get_instance(self) clazz_object.fields["@CLASS_NAME"] = class_name ref = self.add_to_heap(clazz_object) java_class.heap_ref = ref return java_class logger.debug("Class {0} not yet ready".format(class_name)) java_class = class_loader(class_name, self.class_path) super_class = java_class.super_class if type(super_class) is unicode: # lame check super_class = self.get_class(super_class) java_class.super_class = super_class logger.debug("Loaded class def\n{0}".format(java_class)) self.perm_gen[class_name] = java_class # create actual java.lang.Class instance lang_clazz = self.get_class("java/lang/Class") clazz_object = lang_clazz.get_instance(self) clazz_object.fields["@CLASS_NAME"] = class_name ref = self.add_to_heap(clazz_object) java_class.heap_ref = ref self.run_static_constructor(java_class) return java_class
def make_class(this_name, super_name, constant_pool, all_fields, all_methods, all_interfaces, class_flags): '''Actually construct java class from data read earlier''' jc = JavaClass() jc.flags = class_flags if class_flags & 0x0200: # is interface jc.is_interface = True jc.constant_pool = constant_pool jc.this_name = resolve_to_string(constant_pool, this_name) if super_name != 0: jc.super_class = resolve_to_string(constant_pool, super_name) add_fields(jc, constant_pool, all_fields) add_methods(jc, constant_pool, all_methods) add_interfaces(jc, constant_pool, all_interfaces) return jc
def make_class(this_name, super_name, constant_pool, all_fields, all_methods, all_interfaces, class_flags): """Actually construct java class from data read earlier""" jc = JavaClass() jc.flags = class_flags if class_flags & 0x0200: # is interface jc.is_interface = True jc.constant_pool = constant_pool jc.this_name = resolve_to_string(constant_pool, this_name) if super_name != 0: jc.super_class = resolve_to_string(constant_pool, super_name) add_fields(jc, constant_pool, all_fields) add_methods(jc, constant_pool, all_methods) add_interfaces(jc, constant_pool, all_interfaces) return jc
def get_class(self, class_name): '''Returns initialized class from pool (perm_gen) or loads it with class loader (and running static constructor). Getting a class might result in loading it's super first. ''' if class_name is None: return # this is look up for Object's super, which is None if class_name in self.perm_gen: return self.perm_gen[class_name] if class_name[0] == '[': # special treatment for arrays java_class = array_class_factory(self, class_name) lang_clazz = self.get_class("java/lang/Class") clazz_object = lang_clazz.get_instance(self) clazz_object.fields["@CLASS_NAME"] = class_name ref = self.add_to_heap(clazz_object) java_class.heap_ref = ref self.perm_gen[class_name] = java_class return java_class if class_name in ['byte', 'char', 'double', 'float', 'int', 'long', 'short', 'boolean']: java_class = JavaClass() self.perm_gen[class_name] = java_class java_class.is_primitive = True java_class.this_name = class_name lang_clazz = self.get_class("java/lang/Class") clazz_object = lang_clazz.get_instance(self) clazz_object.fields["@CLASS_NAME"] = class_name ref = self.add_to_heap(clazz_object) java_class.heap_ref = ref return java_class logger.debug("Class {0} not yet ready".format(class_name)) java_class = class_loader(class_name, self.class_path) super_class = java_class.super_class if type(super_class) is unicode: # lame check super_class = self.get_class(super_class) java_class.super_class = super_class logger.debug("Loaded class def\n{0}".format(java_class)) self.perm_gen[class_name] = java_class # create actual java.lang.Class instance lang_clazz = self.get_class("java/lang/Class") clazz_object = lang_clazz.get_instance(self) clazz_object.fields["@CLASS_NAME"] = class_name ref = self.add_to_heap(clazz_object) java_class.heap_ref = ref self.run_static_constructor(java_class) return java_class