JDK intéressant, code source de l'objet

Objet JDK

Dix méthodes principales

1,originaire de s'inscrire

Le code source d'une méthode native openJdk1.8 est le suivant

static JNINativeMethod methods[] = {
    {"hashCode",    "()I",                    (void *)&JVM_IHashCode},
    {"wait",        "(J)V",                   (void *)&JVM_MonitorWait},
    {"notify",      "()V",                    (void *)&JVM_MonitorNotify},
    {"notifyAll",   "()V",                    (void *)&JVM_MonitorNotifyAll},
    {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
};

JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
    (*env)->RegisterNatives(env, cls,
                            methods, sizeof(methods)/sizeof(methods[0]));
}

Il peut être compris comme suit: il correspond au nom de méthode de la couche Java à la fonction locale, ce qui est pratique pour le moteur d'exécution pour appeler la fonction C / C ++ selon ces tables de correspondance lors de l'exécution du bytecode
méthodes JNINativeMethod statiques [] Tableau de comparaison des fonctions

2 、originaire de getClass

La méthode finale locale
renvoie la classe d'exécution de cet objet, correspondant à la classe java.lang.Class dans java

3 、 est égal

public boolean equals(Object obj) {
      return (this == obj);
}

l'objet est égal à, une méthode courante n'a rien de spécial, comparer directement l'adresse mémoire, il convient de noter que
如果要重写equals 的话, 记得要一起重写 hashCode方法,因为要满足 equals 相等的两个对象 hashCode 值一定相等 这是来自官方的约定

4 、originaire de hashCode

 public native int hashCode();

Une méthode native, réinscriptible

5 、 clone ()

protected native Object clone() throws CloneNotSupportedException;

Une autre méthode locale, qui est responsable du clonage d'un soi et de le retourner à l'appelant. Il convient de noter:

  • Si la classe clonée n'hérite pas de l'interface java.lang.Cloneable, une exception CloneNotSupportedException sera levée.
    CloneNotSupportedException est une interface vide comme suit:
    public interface Cloneable {
    }
    
    Ensuite, il n'a qu'un seul rôle, il est juste une classe marqueur utilisée pour déterminer si l'objet peut être cloné (pourquoi les grands gars qui conçoivent jdk font-ils cela? Est-ce que quelqu'un sait?)
  • La méthode de clonage n'est qu'une copie superficielle par défaut. Qu'est-ce qu'une copie superficielle?
    La méthode clone ne clone pas les variables membres dans l'objet. Pour obtenir une copie complète, nous devons réécrire la méthode de clonage nous-mêmes

6 、 toString

Il s'agit également d'une méthode plus couramment utilisée. Nous devons souvent convertir une classe en forme de caractères et l'imprimer. Par exemple, le programme System.out.println de code suivant appellera automatiquement la méthode toString d'Object et HashMap.
Alors quel résultat obtiendrons-nous en exécutant ce code?

  1 System.out.println("1:" + new Object());

  2 Map data = new HashMap<>();
  3 data.put("k", "v");
  4 System.out.println("2:" + data);

L'effet d'exécution du programme est le suivant:

1:java.lang.Object@543e710e
2:{k=v}

Nous avons eu une série de personnages en désordre et des personnages raisonnables.
Parce que le code source toString de Object est:

    public String toString() {
        // 规则 包路径 + @ + hashcode 的十六进制字符
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
    /**  
    * Integer.toHexString 将十进制转为十六进制
    * 忽略具体实现
    **/
    public static String toHexString(int i) {
      return toUnsignedString0(i, 4);
    }
    
    

8. notify () notifyAll () sont tous originaire de Méthode native

  • L'effet est similaire. Pour réveiller le thread en attente de libération du verrou par l'objet, la méthode notifyAll consiste à réveiller tous les threads en attente de libération du verrou par l'objet
  • L'appel de cette méthode sans maintenir un verrou lèvera une exception IllegalMonitorStateException
  • Généralement utilisé avec la méthode d'attente
  • Il n'est pas recommandé d'utiliser cette série de méthodes en développement, cela rendra votre code très lisible
  • Après avoir appelé notifier, le verrou ne sera pas libéré immédiatement et l'exécution continuera. Lorsque le verrou est libéré après être sorti de la zone de synchronisation, il réveillera le thread en attente.

9 、 wait () wait (long timeout) wait (long timeout, int nanos)

  • L'appel à l'objet qui détient le verrou libérera immédiatement le verrou et entrera immédiatement dans l'état de blocage, en attendant que la méthode de notification se réveille
  • Après le réveil, re-participer au concours de verrouillage
  • wait (long timeout) Le paramètre wait (long timeout, int nanos) est le temps de timeout. Après avoir attendu ce temps, le programme se réveillera automatiquement.
    timeout (ms) nanos (subtil)
  • wait () n'a pas de méthode de paramètre, s'il n'y a pas de réveil externe, il attendra pour toujours!
  • L'appel de cette méthode sans maintenir un verrou lèvera une exception IllegalMonitorStateException

10 、 finaliser ()

Une méthode très insipide, déconseillée

protected void finalize() throws Throwable { }
  • Collecteur d'orduresCette méthode est appelée une fois avant de recycler un objet à recycler. La prémisse est que cet objet a remplacé finalize ()

Quelle est l'utilité?

  • Avertissez le programme avant le recyclage, le programme peut utiliser la méthode de finalisation pour récupérer certaines ressources, ou vous pouvez effectuer une auto-assistance (vous ne voulez pas être recyclé)
// 拯救自己 《伪代码》
protected void finalize() throws Throwable { 
    某全局静态变量.value = this; // 自我拯救 完成,这样垃圾回收器本次将不会回收我
}
  • Mais sachez que l'objet ne peut être ressuscité qu'une seule fois; pendant le processus de récupération de place, Finalize ne peut pas être appelé sur l'objet ressuscité. Lorsque la collecte des ordures trouve qu'un objet à recycler est un objet de résurrection, il sera directement recyclé

Pourquoi ne pas le recommander?

  • Pas à temps, n'essayez pas enfin à temps, vous devez attendre qu'il soit appelé avant la collecte des ordures, voir l'humeur du GC
  • Augmentez la complexité du processus de recyclage des ordures et réduisez l'efficacité du ramasse-miettes. Une utilisation intensive peut entraîner des problèmes de performances jvm
  • Il n'y a aucune garantie d'appeler l'ordre, cela n'a rien à voir avec l'heure de la mort de l'objet
Publié 17 articles originaux · gagné 24 · vues 280 000+

Je suppose que tu aimes

Origine blog.csdn.net/qq_22956867/article/details/89528087
conseillé
Classement