2017-03-20 6 views
1

Il y a un fichier .jar, j'ai besoin de changer un outil de méthode privée dans un fichier .class. Cette méthode ci-dessousjava reflection: Est-il possible de surcharger une méthode privée en changeant la méthode Id?

private void vibrate() { 
    Vibrator vibrator = (Vibrator)RongContext.getInstance().getSystemService("vibrator"); 
    vibrator.vibrate(new long[]{0L, 200L, 250L, 200L}, -1); 
} 

cette méthode privée est invoquée par une autre une autre méthode privée ci-dessous

private void notify(Context context, Message message, int left) { 
    boolean isInBackground = SystemUtils.isInBackground(context); 
    if(message.getConversationType() != ConversationType.CHATROOM) { 
     if(isInBackground) { 
      RongNotificationManager.getInstance().onReceiveMessageFromApp(message); 
     } else if(!this.isInConversationPager(message.getTargetId(), message.getConversationType()) && left == 0 && System.currentTimeMillis() - this.lastSoundTime > 3000L) { 
      this.lastSoundTime = System.currentTimeMillis(); 
      int ringerMode = NotificationUtil.getRingerMode(context); 
      if(ringerMode != 0) { 
       if(ringerMode != 1) { 
        this.sound(); 
       } 

       this.vibrate(); 
      } 
     } 

    } 
} 

je dois l'entourer d'un si bloc comme celui-ci

private void vibrate() { 
    if(xxx){ 
     Vibrator vibrator = (Vibrator)RongContext.getInstance().getSystemService("vibrator"); 
     vibrator.vibrate(new long[]{0L, 200L, 250L, 200L}, -1); 
    } 
} 

donc je viens se demandait s'il y avait de toute façon à changer l'implémentation de la méthode privée, comme changer la méthode Id utiliser ClassLoader, ou autre chose.

Répondre

2

Il n'y a aucun moyen de le faire avec la réflexion Java.

Vous pouvez le faire avec AOP ou une bibliothèque de manipulation bytecode comme CGlib ou Javassist.