<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Post JEP 411, we need to write Agents to replace the current
    permission checks performed within the JVM by instrumenting it,
    following advice by OpenJDK developers, however for us this goes
    against all our previous development practices, no part of our
    codebase accesses any JDK implementation classes or internal api's. 
    We also don't release anything that depends on deprecated API's. 
    Modules didn't break our code, neither has tightening rules around
    access in JEP 403.<br>
    <p>We have been advised that we need to instrument the JDK with
      Agent's by OpenJDK.<br>
    </p>
    <p>I am now ready to write these Agents, so that I can begin testing
      my new authorization layer for Java: <a
        class="moz-txt-link-freetext"
        href="https://github.com/pfirmstone/HighPerformanceSecurity">https://github.com/pfirmstone/HighPerformanceSecurity</a></p>
    <p> As an example, we need to instrument java.lang.ClassLoader, in
      this case we need to instrument the following method:</p>
    <p><span class="pl-k">private</span> <span class="pl-k">static</span>
      <span class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">Void</span></span>
      <span class="pl-en"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">checkCreateClassLoader</span></span>(<span
        class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">String</span></span>
      <span class="pl-v">name</span>);   This check must be performed
      prior to calling java.lang.Object's constructor, to throw an
      exception, without making ClassLoader susceptible to a finalizer
      attack.<br>
    </p>
    <p>Accessing private internal methods goes against all our current
      development practices, these are at risk of breaking in future.</p>
    <p>We cannot add methods with Agent's only change method contents.<br>
    </p>
    <p>I am requesting hooks, in the form of an annotation, such as the
      following, so that OpenJDK developers know that this method will
      be instrumented by Agent's and not to change it's signature.<br>
    </p>
    <p>@Instrumented<span class="pl-k"><br>
      </span></p>
    <p><span class="pl-k">private</span> <span class="pl-k">static</span>
      <span class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">Void</span></span>
      <span class="pl-en"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">checkCreateClassLoader</span></span>(<span
        class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">String</span></span>
      <span class="pl-v">name</span>);</p>
    <p>If OpenJDK will provide instrumentation hooks, then this is a
      workable solution for us.  <br>
    </p>
    <p>Or is OpenJDK encouraging us to start accessing private methods
      and have to test each Java release for breakages?</p>
    <p>I'm wondering what the point of JEP 403 is if, our solution to
      JEP 411, is to start instrumenting private methods?   I don't
      think this is what OpenJDK developers are proposing.<br>
    </p>
    <p>Currently removing SM will allow an attacker to cause our
      software running on the JVM to parse untrusted data, which
      previously required an authenticated client?  Permission is only
      granted to Principal's, of course post JEP 411, these checks will
      stop working in future, making our software vulnerable to attacks
      by unauthenticated users.<br>
    </p>
    <p>We're still up in the air about how to provide credentials for
      our TLS and Kerberos connections, for authentication, I've created
      support for obtaining the Subject from the Authorization context,
      in my authorization layer software (linked above), but
      instrumenting private methods in the JDK goes against all
      previously learned best practices.</p>
    <pre class="moz-signature" cols="72">-- 
Regards,
 
Peter Firmstone</pre>
    <p>Code snippet from java.lang.ClassLoader:</p>
    <p> </p>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC364" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">if</span> (name <span class="pl-k">!=</span>
            <span class="pl-c1">null</span> <span class="pl-k">&&</span>
            <span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">name</span><span
              class="pl-k">.</span><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">isEmpty</span>())
            {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC365" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">throw</span> <span class="pl-k">new</span>
            <span class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">IllegalArgumentException</span></span>(<span
              class="pl-s"><span class="pl-pds">"</span>name must be
              non-empty or null<span class="pl-pds">"</span></span>);</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC366" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC367" class="blob-code blob-code-inner js-file-line">
            <br>
          </td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC368" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">@SuppressWarnings</span>(<span
              class="pl-s"><span class="pl-pds">"</span>removal<span
                class="pl-pds">"</span></span>)</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC369" class="blob-code blob-code-inner js-file-line">
            <span class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">SecurityManager</span></span>
            <span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">security</span>
            <span class="pl-k">=</span> <span class="pl-smi">System</span><span
              class="pl-k">.</span><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">getSecurityManager</span>();</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC370" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">if</span> (<span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">security</span>
            <span class="pl-k">!=</span> <span class="pl-c1">null</span>)
            {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC371" class="blob-code blob-code-inner js-file-line">
            <span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">security</span><span
              class="pl-k">.</span><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">checkCreateClassLoader</span>();</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC372" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC373" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">return</span> <span class="pl-c1">null</span>;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC374" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC375" class="blob-code blob-code-inner js-file-line">
            <br>
          </td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC376" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">private</span> <span class="pl-en"><span
                class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">ClassLoader</span></span>(<span
              class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">Void</span></span>
            <span class="pl-v">unused</span>, <span class="pl-smi">String</span>
            <span class="pl-v">name</span>, <span class="pl-smi">ClassLoader</span>
            <span class="pl-v">parent</span>) {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC377" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c1"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">this</span></span><span
              class="pl-k">.</span><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">name</span>
            <span class="pl-k">=</span> name;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC378" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c1">this</span><span class="pl-k">.</span>parent
            <span class="pl-k">=</span> parent;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC379" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c1">this</span><span class="pl-k">.</span>unnamedModule
            <span class="pl-k">=</span> <span class="pl-k">new</span> <span
              class="pl-smi">Module</span>(<span class="pl-c1">this</span>);</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC380" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">if</span> (<span class="pl-smi">ParallelLoaders</span><span
              class="pl-k">.</span>isRegistered(<span class="pl-c1">this</span><span
              class="pl-k">.</span>getClass())) {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC381" class="blob-code blob-code-inner js-file-line">
            parallelLockMap <span class="pl-k">=</span> <span
              class="pl-k">new</span> <span class="pl-k">ConcurrentHashMap<></span>();</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC382" class="blob-code blob-code-inner js-file-line">
            assertionLock <span class="pl-k">=</span> <span
              class="pl-k">new</span> <span class="pl-smi">Object</span>();</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC383" class="blob-code blob-code-inner js-file-line">
            } <span class="pl-k">else</span> {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC384" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c"><span class="pl-c">//</span> no
              finer-grained lock; lock on the classloader instance</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC385" class="blob-code blob-code-inner js-file-line">
            parallelLockMap <span class="pl-k">=</span> <span
              class="pl-c1">null</span>;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC386" class="blob-code blob-code-inner js-file-line">
            assertionLock <span class="pl-k">=</span> <span
              class="pl-c1">this</span>;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC387" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC388" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c1">this</span><span class="pl-k">.</span>package2certs
            <span class="pl-k">=</span> <span class="pl-k">new</span> <span
              class="pl-k">ConcurrentHashMap<></span>();</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC389" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c1">this</span><span class="pl-k">.</span>nameAndId
            <span class="pl-k">=</span> nameAndId(<span class="pl-c1">this</span>);</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC390" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC391" class="blob-code blob-code-inner js-file-line">
            <br>
          </td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC392" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c"><span class="pl-c">/**</span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC393" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * If the defining loader has a name
              explicitly set then</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC394" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * '<loader-name>' <span class="pl-k">@<id></span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC395" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * If the defining loader has no name then</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC396" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <qualified-class-name> <span
                class="pl-k">@<id></span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC397" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * If it's built-in loader then omit `<span
                class="pl-k">@<id>`</span> as there is only one
              instance.</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC398" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> <span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC399" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">private</span> <span class="pl-k">static</span>
            <span class="pl-smi">String</span> <span class="pl-en">nameAndId</span>(<span
              class="pl-smi">ClassLoader</span> <span class="pl-v">ld</span>)
            {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC400" class="blob-code blob-code-inner js-file-line">
            <span class="pl-smi">String</span> nid <span class="pl-k">=</span>
            ld<span class="pl-k">.</span>getName() <span class="pl-k">!=</span>
            <span class="pl-c1">null</span> <span class="pl-k">?</span>
            <span class="pl-s"><span class="pl-pds">"</span><span
                class="pl-cce">\'</span><span class="pl-pds">"</span></span>
            <span class="pl-k">+</span> ld<span class="pl-k">.</span>getName()
            <span class="pl-k">+</span> <span class="pl-s"><span
                class="pl-pds">"</span><span class="pl-cce">\'</span><span
                class="pl-pds">"</span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC401" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">:</span> ld<span class="pl-k">.</span>getClass()<span
              class="pl-k">.</span>getName();</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC402" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">if</span> (<span class="pl-k">!</span>(ld
            <span class="pl-k">instanceof</span> <span class="pl-smi">BuiltinClassLoader</span>))
            {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC403" class="blob-code blob-code-inner js-file-line">
            <span class="pl-smi">String</span> id <span class="pl-k">=</span>
            <span class="pl-smi">Integer</span><span class="pl-k">.</span>toHexString(<span
              class="pl-smi">System</span><span class="pl-k">.</span>identityHashCode(ld));</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC404" class="blob-code blob-code-inner js-file-line">
            nid <span class="pl-k">=</span> nid <span class="pl-k">+</span>
            <span class="pl-s"><span class="pl-pds">"</span> @<span
                class="pl-pds">"</span></span> <span class="pl-k">+</span>
            id;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC405" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC406" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">return</span> nid;</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC407" class="blob-code blob-code-inner js-file-line">
            }</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC408" class="blob-code blob-code-inner js-file-line">
            <br>
          </td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC409" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c"><span class="pl-c">/**</span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC410" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * Creates a new class loader of the
              specified name and using the</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC411" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * specified parent class loader for
              delegation.</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC412" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> *</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC413" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <span class="pl-k">@apiNote</span> If the
              parent is specified as {<span class="pl-k">@code</span><span
                class="pl-c1"> null</span>} (for the</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC414" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * bootstrap class loader) then there is no
              guarantee that all platform</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC415" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * classes are visible.</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC416" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> *</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC417" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <span class="pl-k">@param</span> name
              class loader name; or {<span class="pl-k">@code</span><span
                class="pl-c1"> null</span>} if not named</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC418" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <span class="pl-k">@param</span> parent
              the parent class loader</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC419" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> *</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC420" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <span class="pl-k">@throws</span>
              IllegalArgumentException if the given name is empty.</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC421" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> *</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC422" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <span class="pl-k">@throws</span>
              SecurityException</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC423" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * If a security manager exists and its</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC424" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * {<span class="pl-k">@link</span>
              SecurityManager#checkCreateClassLoader()}</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC425" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * method doesn't allow creation of a new
              class loader.</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC426" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> *</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC427" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> * <span class="pl-k">@since</span> 9</span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC428" class="blob-code blob-code-inner js-file-line"><span
              class="pl-c"> <span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC429" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">protected</span> <span class="pl-en">ClassLoader</span>(<span
              class="pl-smi">String</span> <span class="pl-v">name</span>,
            <span class="pl-smi">ClassLoader</span> <span class="pl-v">parent</span>)
            {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC430" class="blob-code blob-code-inner js-file-line">
            <span class="pl-c1">this</span>(checkCreateClassLoader(name),
            name, parent);</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
    }
    <table class="highlight tab-size js-file-line-container"
      data-tab-size="8" data-paste-markdown-skip="">
      <tbody>
        <tr>
          <td id="LC363" class="blob-code blob-code-inner js-file-line">
            <span class="pl-k">private</span> <span class="pl-k">static</span>
            <span class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">Void</span></span>
            <span class="pl-en"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">checkCreateClassLoader</span></span>(<span
              class="pl-smi"><span class="pl-token"
data-hydro-click="{"event_type":"code_navigation.click_on_symbol","payload":{"action":"click_on_symbol","repository_id":370898673,"ref":"cd8783c08ee18167f15df621e997015b971bfb01","language":"Java","originating_url":"https://github.com/pfirmstone/jdk/blob/cd8783c08ee18167f15df621e997015b971bfb01/src/java.base/share/classes/java/lang/ClassLoader.java","user_id":11625778}}"
data-hydro-click-hmac="aab2699bf8d5b6116760e1b70c1d90c08084c67fd0148bd7203b48443a421d1c">String</span></span>
            <span class="pl-v">name</span>) {</td>
        </tr>
        <tr>
        </tr>
      </tbody>
    </table>
  </body>
</html>