<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="en-CZ" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">I like your proposal and I would like to see it as a fallback solution for DEFAULT_CLASS_HIERARCHY_RESOLVER when the class is not available as resource stream.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">  
</span><span style="font-family:"Courier New";color:#969696">/**</span><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:#969696">     *
<b>Default</b></span><span style="font-family:"Courier New";color:black"> </span>
<b><span style="font-family:"Courier New";color:#969696">singleton</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">instance</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">of {@linkplain</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">ClassHierarchyResolver}</span></b><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:#969696">     *
<b>using {@link</b></span><span style="font-family:"Courier New";color:black"> </span>
<b><span style="font-family:"Courier New";color:#969696">ClassLoader#getSystemResourceAsStream(String)}
</span></b><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:#969696">     *
<b>as</b></span><span style="font-family:"Courier New";color:black"> </span><b><span style="font-family:"Courier New";color:#969696">the {@code</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">ClassStreamResolver}</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">with</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">fallback</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">to</span></b><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:#969696">     *
<b>{@link</b></span><span style="font-family:"Courier New";color:black"> </span><b><span style="font-family:"Courier New";color:#969696">ClassLoader.getSystemClassLoader()} class</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">loading</span></b><span style="font-family:"Courier New";color:black">
</span><b><span style="font-family:"Courier New";color:#969696">resolver.</span></b><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">    
</span><span style="font-family:"Courier New";color:#969696">*/</span><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">    ClassHierarchyResolver
</span><i><span style="font-family:"Courier New";color:#CE54B8">DEFAULT_CLASS_HIERARCHY_RESOLVER</span></i><span style="font-family:"Courier New";color:black"><o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">            =
</span><span style="font-family:"Courier New";color:#336BDD">new</span><span style="font-family:"Courier New";color:black"> ClassHierarchyImpl.CachedClassHierarchyResolver(<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">           
</span><span style="font-family:"Courier New";color:#336BDD">new</span><span style="font-family:"Courier New";color:black"> Function<ClassDesc, InputStream>() {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">                @Override<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">               
</span><span style="font-family:"Courier New";color:#336BDD">public</span><span style="font-family:"Courier New";color:black"> InputStream
<b>apply</b>(ClassDesc classDesc) {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">                   
</span><span style="font-family:"Courier New";color:#336BDD">return</span><span style="font-family:"Courier New";color:black"> ClassLoader.<i>getSystemResourceAsStream</i>(Util.<i>toInternalName</i>(classDesc) +
</span><span style="font-family:"Courier New";color:#1E9347">".class"</span><span style="font-family:"Courier New";color:black">);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">                }<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-family:"Courier New";color:black">            })<b>.orElse(ClassHierarchyResolver.<i>of</i>(ClassLoader.<i>getSystemClassLoader</i>()));</b><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Adam<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt">On 16.03.2023 17:05, "liangchenblue@gmail.com" <liangchenblue@gmail.com> wrote:<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt">For context, in 8294961<br>
<a href="https://github.com/openjdk/jdk/pull/10991/files#r1133086265">https://github.com/openjdk/jdk/pull/10991/files#r1133086265</a> I wondered<br>
about whether to use a hierarchy resolver for LambdaMetafactory, that<br>
I think resolution may encounter problems as the default resolver may<br>
not be able to resolve user-supplied interfaces.<br>
<br>
In addition, many of the class file generation usages I've seen<br>
include firing events via an event bus, calling patched external addon<br>
code (as seen in Minecraft modding), in which Reflection-based<br>
hierarchy resolution would work better than reading bytecode files.<br>
<br>
Thus, I've prepared a patch creating ClassHierarchyResolver<br>
<a href="https://github.com/openjdk/jdk/commit/0c888ba1e2953cf946012244446f4f8c05ba5d77">https://github.com/openjdk/jdk/commit/0c888ba1e2953cf946012244446f4f8c05ba5d77</a><br>
to ease up resolution with reflection, when a ClassLoader (for older<br>
APIs) or a MethodHandle.Lookup (for modern APIs) is available.<br>
<br>
Does this appear feasible?<br>
<br>
Chen<o:p></o:p></span></p>
</div>
</div>
</body>
</html>