与JVM规范中的classesInOtherPkgWithProtectedMember混淆,更常见的是访问受保护成员的规则

Java jvms指出:

如果List是Chain中名称为MemberClassname的一组类(与受保护成员名为Class的类不同),则谓词classInOtherPkgWithProtectedMember(Class,MemberName,MemberDescriptor,MemberClassname,Chain,List)为true具有描述符MemberDescriptor的MemberName。

classesInOtherPkgWithProtectedMember(_,_,[],[]).

classesInOtherPkgWithProtectedMember(Class,MemberName,MemberDescriptor,MemberClassname,[class(MemberClassname,L) | Tail],L) | T]) :-
    differentRuntimePackage(Class,class(MemberClassname,L)),loadedClass(MemberClassname,L,Super),isProtected(Super,MemberDescriptor),classesInOtherPkgWithProtectedMember(
    Class,Tail,T).

classesInOtherPkgWithProtectedMember(Class,T) :-
    differentRuntimePackage(Class,isnotProtected(Super,T) :-
    sameRuntimePackage(Class,T).

但是,从上方看classesInOtherPkgWithProtectedMember的定义,我们看到classesInOtherPkgWithProtectedMember的定义始终从Chain中弹出class(MemberClassname,L)。给定一个简单的超类链,如下所示,classesInOtherPkgWithProtectedMember将始终失败,因为它无法为链中的每个元素弹出具有相同名称的类。更具体地说,它被强制始终弹出名称为MemberClassname的类。

    class('java/util/HashMap',bootstrapLoader)
    class('java/util/AbstractMap',bootstrapLoader),class('java/lang/Object',bootstrapLoader)

我是否误解了此Prolog代码,或者classesInOtherPkgWithProtectedMember对于Chain的所有非平凡值是否失败?这是否以某种方式依靠回溯来获得更简单的Chain,然后可以成功?是否存在某种灵活的名称概念,其中MemberClassname有时表示不合格的名称,而有时则表示名称+包?是否应该有一个MemberClassname1和一个MemberCLassname2,以免每次都不会从Chain弹出相同的类?

qingzhihanbing 回答:与JVM规范中的classesInOtherPkgWithProtectedMember混淆,更常见的是访问受保护成员的规则

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2788016.html

大家都在问