<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Perhaps the solution is to replace the entire class, instead of
      instrumenting one method?</p>
    <p>Compile a patched copy of the JVM, with modified class files,
      then replace the existing classes in the JVM with the modified
      classes?</p>
    <p>Kinda like maintaining a fork, but using Agents to instrument the
      original JVM with classes from the fork?</p>
    I sure wish there was a better option, if anyone knows one, I'm all
    ears.<br>
    <p>Regards,</p>
    <p>Peter.<br>
    </p>
    <div class="moz-cite-prefix">On 23/07/2021 6:36 pm, Peter Firmstone
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:d1c941fe-967f-8827-91c4-05295bb9024d@zeus.net.au">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      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"
          moz-do-not-send="true">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>
    </blockquote>
    <pre class="moz-signature" cols="72">
</pre>
  </body>
</html>