2013-03-26 5 views
0

J'ai besoin de remplir la fonction intégrée ~ 20k et les constantes d'un fichier CHM dans une liste. J'ai d'abord essayé de sérialiser une liste d'entre eux, mais la désérialisation prend 1500ms (trop long pour un code rapide, même au premier coup).Génération de code Java très gros

Génération de code à l'aide de StringTemplate, qui génère du code valide. Mais il ne compilera pas car la méthode "initEnums() dépasse la limite de taille de 65536". (Et mon Eclipse meurt peu de temps après)

La méthode générée ressemble à ceci:

public XModelField[] initEnums() { 
    return new XModelField[] { 
     new XModelField("aName", "aType", ...), 
     ... 
     // About 4'000 more entries 
    }; 
} 

Si cette limite est limitée uniquement au code source, je pourrais utiliser une autre bibliothèque pour générer le fichier de classe directement (CodeModel peut-être). Je voudrais garder mon code, si possible sans réécrire le générateur de sortie à partir de zéro. Aucune suggestion?

+0

qu'en est-il de la désérialisation à l'avance (et/ou de la mise en cache agressive)? –

+1

cette contrainte est une contrainte des fichiers de classe. L'analyseur de code source ne se soucie pas de limites arbitraires. –

+0

@jan Amélioration dynamique du démarrage et des performances. Je ne veux pas non plus que les amateurs de reverse engineering copient facilement mes données; les dépendances de classe devraient les mettre derrière pendant un moment. Je suppose que CodeModel n'a aucune limite de ce genre sur les méthodes, non? –

Répondre

1

Je pense que vous devriez reconsidérer votre stratégie. Modélisez vos structures et méthodes de données en conséquence et vous n'avez pas besoin de générer du code. Au lieu de générer le code Java pour 4000 constantes, stockez vos données dans un fichier ou une base de données et écrivez une méthode courte pour lire ces données au moment de l'initialisation pour remplir une liste avec vos objets de données.

La génération de code est un outil puissant, mais vous devez l'utiliser avec précaution. Je ne vois pas que c'est même nécessaire pour votre cas d'utilisation, mais si vous le pensez, alors vous pouvez essayer de minimiser la portion de code à générer au minimum pour garder les choses simples. Souvent, vous pouvez extraire beaucoup de code générique à une super classe abstraite de sorte que vous avez seulement à générer le code pour certaines méthodes dans les sous-classes. Et générer du code pour 4000 constantes est vraiment inutile. Conservez les données sous forme de données et utilisez dynamiquement vos données.

+0

J'ai utilisé le framework ASM, mais une limitation très similaire contraint les fichiers de classe. Le seul message d'erreur que j'ai reçu était simplement "Corps de méthode trop grand". –

+0

@ Matej'Yin'Gagyi C'est le corps de méthode de la méthode d'initialisation de classe spéciale '', qui doit initialiser toutes les constantes de la classe. –

+0

@PauloEbermann J'appelle l'initialisation de chaque méthode de clinit. Peu importe comment vous structurez les appels. Si une méthode est trop grande, c'est trop gros. –

Questions connexes