dataentryrewriter.java

来自「proguard 一个java的混淆器」· Java 代码 · 共 165 行

JAVA
165
字号
/* * 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.io;import proguard.classfile.*;import java.io.*;/** * This DataEntryReader writes the resource data entries that it reads to a * given DataEntryWriter, updating their contents based on the renamed classes * in the given ClassPool. * * @author Eric Lafortune */public class DataEntryRewriter implements DataEntryReader{    private final ClassPool       classPool;    private final DataEntryWriter dataEntryWriter;    /**     * Creates a new DataEntryRewriter.     */    public DataEntryRewriter(ClassPool       classPool,                             DataEntryWriter dataEntryWriter)    {        this.classPool       = classPool;        this.dataEntryWriter = dataEntryWriter;    }    // Implementations for DataEntryReader.    public void read(DataEntry dataEntry) throws IOException    {        try        {            // Get the output entry corresponding to this input entry.            OutputStream outputStream = dataEntryWriter.getOutputStream(dataEntry);            if (outputStream != null)            {                InputStream inputStream = dataEntry.getInputStream();                // Copy the data from the input entry to the output entry.                copyData(inputStream, outputStream);                // Close the data entries.                dataEntry.closeInputStream();            }        }        catch (IOException ex)        {            System.err.println("Warning: can't write resource [" + dataEntry.getName() + "] (" + ex.getMessage() + ")");        }    }    // Small utility methods.    /**     * Copies all data that it can read from the given input stream to the     * given output stream.     */    private void copyData(InputStream  inputStream,                          OutputStream outputStream)    throws IOException    {        Reader reader = new BufferedReader(new InputStreamReader(inputStream));        Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream));        StringBuffer word = new StringBuffer();        while (true)        {            int i = reader.read();            if (i < 0)            {                break;            }            // Is the character part of a word?            char c = (char)i;            if (Character.isJavaIdentifierPart(c) ||                c == '.' ||                c == '-')            {                // Collect the characters in this word.                word.append(c);            }            else            {                // Write out the updated word, if any.                writeUpdatedWord(writer, word.toString());                word.setLength(0);                // Write out the character that terminated it.                writer.write(c);            }        }        // Write out the final word.        writeUpdatedWord(writer, word.toString());        writer.flush();        outputStream.flush();    }    /**     * Writes the given word to the given writer, after having adapted it,     * based on the renamed class names.     */    private void writeUpdatedWord(Writer writer, String word)    throws IOException    {        if (word.length() > 0)        {            String newWord = word;            boolean containsDots = word.indexOf('.') >= 0;            // Replace dots by forward slashes.            String className = containsDots ?                word.replace('.', ClassConstants.INTERNAL_PACKAGE_SEPARATOR) :                word;            // Find the class corrsponding to the word.            Clazz clazz = classPool.getClass(className);            if (clazz != null)            {                // Update the word if necessary.                String newClassName = clazz.getName();                if (!className.equals(newClassName))                {                    // Replace forward slashes by dots.                    newWord = containsDots ?                        newClassName.replace(ClassConstants.INTERNAL_PACKAGE_SEPARATOR, '.') :                        newClassName;                }            }            writer.write(newWord);        }    }}

⌨️ 快捷键说明

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