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弹出相同的类?