📄 classspecificationvisitorfactory.java
字号:
} else { // Start visiting from the extended class name. className = extendsClassName; } } // If specified, visit a single named class, otherwise visit all classes. return className != null ? (ClassPoolVisitor)new NamedClassFileVisitor(composedClassFileVisitor, className) : (ClassPoolVisitor)new AllClassFileVisitor(composedClassFileVisitor); } /** * Creates a new ClassPoolVisitor to efficiently travel to the specified class * members. * * @param classSpecification the specifications of the class members to visit. * @param memberInfoVisitor the MemberInfoVisitor to be applied to matching * class members. */ private static ClassFileVisitor createClassFileVisitor(ClassSpecification classSpecification, MemberInfoVisitor memberInfoVisitor) { MultiClassFileVisitor multiClassFileVisitor = new MultiClassFileVisitor(); addMemberInfoVisitors(classSpecification.fieldSpecifications, true, multiClassFileVisitor, memberInfoVisitor); addMemberInfoVisitors(classSpecification.methodSpecifications, false, multiClassFileVisitor, memberInfoVisitor); // Mark the class member in this class and in super classes. return new ClassFileHierarchyTraveler(true, true, false, false, multiClassFileVisitor); } /** * Adds elements to the given MultiClassFileVisitor, to apply the given * MemberInfoVisitor to all class members that match the given List * of options (of the given type). */ private static void addMemberInfoVisitors(List classMemberSpecifications, boolean isField, MultiClassFileVisitor multiClassFileVisitor, MemberInfoVisitor memberInfoVisitor) { if (classMemberSpecifications != null) { for (int index = 0; index < classMemberSpecifications.size(); index++) { ClassMemberSpecification classMemberSpecification = (ClassMemberSpecification)classMemberSpecifications.get(index); multiClassFileVisitor.addClassFileVisitor( createClassFileVisitor(classMemberSpecification, isField, memberInfoVisitor)); } } } /** * Constructs a ClassFileVisitor that conditionally applies the given * ClassFileVisitor to all classes that contain the given class members. */ private static ClassFileVisitor createClassFileMemberInfoTester(ClassSpecification classSpecification, ClassFileVisitor classFileVisitor) { // Create a linked list of conditional visitors, for fields and for // methods. return createClassFileMemberInfoTester(classSpecification.fieldSpecifications, true, createClassFileMemberInfoTester(classSpecification.methodSpecifications, false, classFileVisitor)); } /** * Constructs a ClassFileVisitor that conditionally applies the given * ClassFileVisitor to all classes that contain the given List of class * members (of the given type). */ private static ClassFileVisitor createClassFileMemberInfoTester(List classMemberSpecifications, boolean isField, ClassFileVisitor classFileVisitor) { // Create a linked list of conditional visitors. if (classMemberSpecifications != null) { for (int index = 0; index < classMemberSpecifications.size(); index++) { ClassMemberSpecification classMemberSpecification = (ClassMemberSpecification)classMemberSpecifications.get(index); classFileVisitor = createClassFileVisitor(classMemberSpecification, isField, new ClassFileMemberInfoVisitor(classFileVisitor)); } } return classFileVisitor; } /** * Creates a new ClassFileVisitor to efficiently travel to the specified class * members. * * @param classMemberSpecification the specification of the class member(s) * to visit. * @param memberInfoVisitor the MemberInfoVisitor to be applied to * matching class member(s). */ private static ClassFileVisitor createClassFileVisitor(ClassMemberSpecification classMemberSpecification, boolean isField, MemberInfoVisitor memberInfoVisitor) { String name = classMemberSpecification.name; String descriptor = classMemberSpecification.descriptor; // If name or descriptor are not fully specified, only visit matching // class members. boolean fullySpecified = name != null && descriptor != null && !containsWildCards(name) && !containsWildCards(descriptor); if (!fullySpecified) { if (descriptor != null) { memberInfoVisitor = new MemberInfoDescriptorFilter(descriptor, memberInfoVisitor); } if (name != null) { memberInfoVisitor = new MemberInfoNameFilter(name, memberInfoVisitor); } } // If any access flags are specified, only visit matching class members. if (classMemberSpecification.requiredSetAccessFlags != 0 || classMemberSpecification.requiredUnsetAccessFlags != 0) { memberInfoVisitor = new MemberInfoAccessFilter(classMemberSpecification.requiredSetAccessFlags, classMemberSpecification.requiredUnsetAccessFlags, memberInfoVisitor); } // Depending on what's specified, visit a single named class member, // or all class members, filtering the matching ones. return isField ? fullySpecified ? (ClassFileVisitor)new NamedFieldVisitor(name, descriptor, memberInfoVisitor) : (ClassFileVisitor)new AllFieldVisitor(memberInfoVisitor) : fullySpecified ? (ClassFileVisitor)new NamedMethodVisitor(name, descriptor, memberInfoVisitor) : (ClassFileVisitor)new AllMethodVisitor(memberInfoVisitor); } // Small utility methods. private static boolean containsWildCards(String string) { return string != null && (string.indexOf('*') >= 0 || string.indexOf('?') >= 0); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -