⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 membernameconflictfixer.java

📁 ProGuard 是一个免费的 Java类文件的压缩
💻 JAVA
字号:
/* * ProGuard -- shrinking, optimization, obfuscation, and preverification *             of Java bytecode. * * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */package proguard.obfuscate;import proguard.classfile.util.*;import proguard.classfile.*;import proguard.classfile.visitor.MemberVisitor;import java.util.Map;/** * This MemberInfoVisitor solves obfuscation naming conflicts in all class * members that it visits. It avoids names from the given descriptor map, * delegating to the given obfuscator in order to get a new name if necessary. * * @author Eric Lafortune */public class MemberNameConflictFixer implements MemberVisitor{    private boolean          allowAggressiveOverloading;    private Map              descriptorMap;    private WarningPrinter   warningPrinter;    private MemberObfuscator memberObfuscator;    /**     * Creates a new MemberNameConflictFixer.     * @param allowAggressiveOverloading a flag that specifies whether class     *                                   members can be overloaded aggressively.     * @param descriptorMap              the map of descriptors to     *                                   [new name - old name] maps.     * @param warningPrinter             an optional warning printer to which     *                                   warnings about conflicting name     *                                   mappings can be printed.     * @param memberObfuscator           the obfuscator that can assign new     *                                   names to members with conflicting     *                                   names.     */    public MemberNameConflictFixer(boolean          allowAggressiveOverloading,                                   Map              descriptorMap,                                   WarningPrinter   warningPrinter,                                   MemberObfuscator memberObfuscator)    {        this.allowAggressiveOverloading = allowAggressiveOverloading;        this.descriptorMap              = descriptorMap;        this.warningPrinter             = warningPrinter;        this.memberObfuscator           = memberObfuscator;    }    // Implementations for MemberVisitor.    public void visitProgramField(ProgramClass programClass, ProgramField programField)    {        visitMember(programClass, programField, true);    }    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)    {        // Special cases: <clinit> and <init> are always kept unchanged.        // We can ignore them here.        String name = programMethod.getName(programClass);        if (name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) ||            name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT))        {            return;        }        visitMember(programClass, programMethod, false);    }    public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {}    public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {}    /**     * Obfuscates the given class member.     * @param clazz   the class  of the given member.     * @param member  the class member to be obfuscated.     * @param isField specifies whether the class member is a field.     */    private void visitMember(Clazz   clazz,                             Member  member,                             boolean isField)    {        // Get the member's name and descriptor.        String name       = member.getName(clazz);        String descriptor = member.getDescriptor(clazz);        // Check whether we're allowed to overload aggressively.        if (!allowAggressiveOverloading)        {            // Trim the return argument from the descriptor if not.            // Works for fields and methods alike.            descriptor = descriptor.substring(0, descriptor.indexOf(')')+1);        }        // Get the name map, creating a new one if necessary.        Map nameMap = MemberObfuscator.retrieveNameMap(descriptorMap, descriptor);        // Get the member's new name.        String newName = MemberObfuscator.newMemberName(member);        String previousName = (String)nameMap.get(newName);        if (!name.equals(previousName))        {            // There's a conflict! A member (with a given old name) in a            // first namespace has received the same new name as this            // member (with a different old name) in a second name space,            // and now these two have to live together in this name space.            if (MemberObfuscator.hasFixedNewMemberName(member) &&                warningPrinter != null)            {                descriptor = member.getDescriptor(clazz);                warningPrinter.print("Warning: " + ClassUtil.externalClassName(clazz.getName()) +                                                   (isField ?                                                       ": field '" + ClassUtil.externalFullFieldDescription(0, name, descriptor) :                                                       ": method '" + ClassUtil.externalFullMethodDescription(clazz.getName(), 0, name, descriptor)) +                                     "' can't be mapped to '" + newName +                                     "' because it would conflict with " +                                     (isField ?                                         "field '" :                                         "method '" ) + previousName +                                     "', which is already being mapped to '" + newName + "'");            }            // Clear the conflicting name.            MemberObfuscator.setNewMemberName(member, null);            // Assign a new name.            member.accept(clazz, memberObfuscator);        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -