2010-12-11 38 views
3

est-il possible d'effectuer des modifications dans l'objet lors de l'exécution. Mon problème est que j'ai une classe qui me renvoie l'instance de logger. et cette classe contient seulement une méthode publique qui renvoie l'enregistreur. ci-dessous est la classe ..pouvons-nous faire une modification à l'objet renvoyé à l'exécution

public class LoggerManager { 

    public Logger getLogger(String FQCN) { 
     Logger logger = Logger.getLogger(FQCN); 
      logger.setLevel(Level.INFO); 
      return logger; 
    } 
} 

maintenant si je veux changer l'objet de retour lors de l'exécution,

ce qui signifie que l'objet de l'enregistreur qui est mis à niveau INFO, je veux changer que l'on DEBUG .. lors de l'exécution du programme que lorsque ce code est appelé à un moment donné ... sans changer le code partout .. quelque chose comme ça ...

logger.setLevel(Level.DEBUG); 

i peut y parvenir, par tout moyen ??

que cette classe est utilisé partout dans mon code .. A propos de 1000 places, sans changer le code par .... certains moyens peuvent atteindre cet i ...

+0

J'ai lu ceci 3 fois et je ne comprends toujours pas votre question. peux-tu élaborer? –

+0

@amir: j'ai mis à jour ,, s'il vous plaît dites-moi si maintenant vous êtes en mesure de comprendre ou non ?? .. –

+0

Pouvez-vous expliquer pourquoi cela ne devrait pas fonctionner? Ne comprends pas. :) – InsertNickHere

Répondre

2

Je pense que vous demandez si vous pouvez changer le comportement de la méthode getLogger(String) sans changer la classe. La réponse simple est "non vous ne pouvez pas".

Il y a quelques trucs que vous pouvez essayer:

  • Mettre une version différente de la classe devant l'actuel en avance sur la version actuelle classpath de l'application.Utilisation de BCEL ou de quelque chose pour modifier les bytecodes de classe avant le chargement.

Cependant, ces deux éléments peuvent changer la classe.

Je pense que votre approche la plus simple consiste à modifier la classe LogManager afin que vous puissiez générer des enregistreurs avec différents niveaux. Avec un peu de réflexion, vous devriez être en mesure de trouver une solution qui n'a pas d'impact significatif sur le reste de votre base de code.

Toutefois, il est également inutile de noter que la manière normale de définir les niveaux de journalisation consiste à utiliser un fichier de configuration plutôt que des appels explicites à setLevel dans l'application.

+0

(utilisez un fichier de configuration ... ou [juste] DI) –

+0

@pst - l'utilisation de DI pour définir les niveaux de consignation serait probablement une mauvaise idée. La pratique normale consiste à utiliser les fichiers de configuration de journalisation ... c'est là que la plupart des gens * s'attendent * à trouver ce genre de choses. –

1

est-il possible de le faire quelques modifications dans l'objet au moment de l'exécution

Oui, vous pouvez apporter des modifications sur Objects renvoyées par les appels de méthode.

Il est difficile de comprendre ce que vous voulez faire. Si vous définissez le niveau de débogage sur l'enregistreur retourné, il doit être défini pour tous les endroits dans votre vm en cours d'exécution qui demandent un Logger avec le même argument FQCN.

0

Vous pouvez définir la valeur souhaitée avant votre appel et revenir à la normale par la suite. Les classes de journalisation de Somme le permettent.

I can't be specific here because your didn't say exactly what your Logger class is (Log4j ?). 

Cette classe de logger semble être appelée comme une méthode statique. Par conséquent, si vous avez des threads dans votre système (si vous utilisez Tomcat par exemple, ou utilisez un thread d'arrière-plan), modifier le niveau est dangereux (il va modifier pour vous mais aussi pour tous les threads). Cependant, l'option habituelle à votre problème n'est pas de changer le niveau. Lorsque vous voulez un journal apparaisse, soit:

  1. Connexion à un niveau qui apparaît
  2. Choisissez un enregistreur différent (chacun peut être configuré à un niveau spécifique).
0

Il est possible de le faire avec AOP mais il est plutôt compilé. AOP vous permet de gérer à la fois l'invocation pré et post méthode. Je ne sais pas pourquoi vous devez obtenir plus de 1000 places dans votre projet unique. Avez-vous plus de 1000 cours? Normalement, vous n'avez besoin de l'appeler qu'une fois par classe. Je voudrais également changer le code et redessiner la surimpression à cette méthode.