Parte do problema é que JavaMetaClass. new assume que sempre será chamado para criar um proxy, quando será chamado para cada classe descendente. Na mesma linha, o manuseio do jclass_registry deve ser restrito aos proxies reais. Outra coisa que descobri é que o tratamento de objetos retornados de Java é negligente, o que impossibilita passá-los de volta para métodos Java.
Posso trabalhar em algumas dessas questões no devido tempo.
Gosto muito da rapidez com que o jnius carrega Java e pode usar as versões mais recentes do Python.
Quer apoiar esta questão? Poste uma recompensa por isso! Aceitamos recompensas via Bountysource .
Desculpe a demora, você pode fornecer uma descrição mais específica (casos de teste?) para cada um desses problemas? Comecei alguns trabalhos para permitir a herança de classes java de python (usando proxies), mas não está completo, no entanto, os problemas que você aponta aqui parecem vagamente relacionados a isso e provavelmente devem ser divididos em vários problemas diferentes.
Desculpe entrar na discussão, mas herdar uma classe Java pode não ser o que você precisa @Apalala , acho que é uma ideia melhor envolver a classe Java em uma classe Python como é feito nesta classe . Pode não ser óbvio no código vinculado porque todas as autoclasses são feitas em java.py , mas o código é equivalente a
class MyJavaWrapperClass(AnyPythonClassOrMixin):
def __init__(self, *args, **kwargs):
JavaClass = autoclass('org.uber.cool.JavaClass`)
self._my_java_object = JavaClass(*args, **kwargs) # use double underscore to "hide" the Java object
As razões para não herdar a classe Java são:
class Element
, class Node
e class Relationship
no gráfico quase todos eles tem código clichê mesmo que na maioria das vezes seja para tornar a API mais Pythonica ;)Do ponto de vista do desempenho, acho que não há impacto, mas @tshirtman pode saber melhor.
Outra coisa, envolver objetos Java funciona agora e muito bem :-)
É possível substituir o método java usando o código python por enquanto?
E a herança de classe java?
Passei muito tempo olhando para isso e cheguei à conclusão de que não havia uma maneira prática de fazer isso, além de gerar bytecode java em tempo de execução, existem bibliotecas para fazer isso, mas parecia adicionar muita complicação para a biblioteca, e provavelmente fora do escopo. Não tenho certeza sobre o fechamento, mas não acho que seja trabalhado, então não seria razoável marcá-lo como não corrigido.
@monami7001 algum progresso?
isso foi ~ 4 anos atrás e, que eu saiba, não, gerar bytecode java em tempo de execução ainda parece a única opção (e talvez não seja tão ruim quanto eu e devemos analisar isso).
Uma solução alternativa é:
para usá-lo com autoclass