Cacher Système..imprimer les appels d'une classe
Je suis en utilisant une bibliothèque java (fichier jar). L'auteur du fichier mis dans un tas de System.out.print
et System.out.println
s. Est-il possible de masquer ces messages pour un objet particulier?
*EDIT: On dirait que le fichier jar semble être la création d'un groupe de threads et chaque thread a son propre Système..println...
OriginalL'auteur K2xL | 2011-12-02
Vous devez vous connecter pour publier un commentaire.
Changement d'origine PrintStream avec un Mannequin un qui ne fait rien sur c'est
write()
méthode.N'oubliez pas de remplacer original PrintStream lorsque vous avez terminé.
Juste avant une méthode de pot invoquée utilisation
System.setOut(dummyStream);
. Juste après une méthode de pot invoquée utilisationSystem.setOut(originalStream);
. Ok?Pas exactement. Le fichier jar crée un groupe de threads qui font chacun un Système....
dans ce cas, l'utilisation de
dummyStream
tout le temps. Lorsque vous avez besoin d'imprimer quelque chose à la console d'utiliseroriginalStream
.OriginalL'auteur Kerem Baydoğan
System.setOut();
est probablement ce que vous cherchezSource
System.out.println
etSystem.out.print
appels de tous classes.ah oui je viens de demander à l'auteur de répondre à cette question... donc il n'y a aucun moyen de le cacher à partir d'un seul fichier spécifique? j'ai un système.out dans ma classe que je ne veux pas cacher... juste celles que l'auteur de ce pot a..
Voir ma réponse
qu'entendez-vous par juste un fichier spécifique? Merci de nous montrer la problématique partie de votre code.
Pour échapper à une classe spécifique fichier ou plusieurs fichiers de classe que vous pourriez aspect. Aspectj avec ci-dessus de l'excellent travail!
OriginalL'auteur Grambot
Il y a deux façons que je peux penser de cette autre que ce qui a déjà été posté:
1. Utiliser un Java decompiler et de supprimer chaque
System.out
appel et de recompiler le bocal. Je recommanderais cette une si vous choisissez cette voie.2. Vous pouvez utiliser la trace de la pile pour trouver le type d'appel. (À partir de Comment puis-je trouver de l'appelant d'une méthode à l'aide de stacktrace ou de réflexion?)
Où
classNames
est le nom complet de chaque classe dans le fichier jar etsomeNumber
est la bonne place dans la pile, vous devez être à la recherche au (probablement 1 ou 2)./e1
Après quelques tests, je crois que le nombre dont vous aurez besoin pour
someNumber
est de 10 ou 11. C'est parce queSystem.out.print
ne pas appeler directement lewrite
méthode.Exemple trace de la pile pour l'écriture
h
:(Traces de pile sont dans l'index,
getClassName
,getFileName
,getMethodName
commande).Exemple trace de la pile pour l'écriture
\n
:reflection.StackTrace
est la classe principale que j'utilise pour faire le test.reflection.StackTrace$1
est monfilterStream
et je suis d'appelerSystem.out.println
de lamain
méthode dansreflection.StackTrace
./e2
Ce 11 ou 10 écart semble être parce que
println
appelsprint
etnewLine
.print
fait appelwrite
toutnewLine
directement écrit le caractère de nouvelle ligne dans le flux. Mais cela ne devrait pas d'importance puisque le pot ne contiennent pas dejava.io.PrintStream
.OriginalL'auteur Jeffrey
Si vous avez un gros programme de considérer quelque chose comme
Cela garantit que vous pouvez activer /désactiver la sortie sur et en dehors dans des classes différentes, tout en étant assurés d'être en mesure de transformer la sortie sur le tard.
Vous, par exemple de l'utiliser en appelant
toggleOutput(false)
au début de chaque méthode ettoggleOutput(true)
à la fin de chaque méthode.OriginalL'auteur HopefullyHelpful
Solution de votre question est ici.. dans la méthode
SysOutController.ignoreSysout();
OriginalL'auteur Dharmendrasinh Chudasama