001    package sysModel.classFile.constantPool;
002    
003    import sysModel.classFile.constantPool.visitors.IPoolInfoVisitor;
004    
005    import java.io.DataInputStream;
006    import java.io.IOException;
007    
008    /**
009     * Represents a method in the constant pool.
010     *
011     * @author Mathias Ricken
012     */
013    public class MethodPoolInfo extends AClassNameTypePoolInfo {
014        /**
015         * Constructor
016         *
017         * @param clas        class information
018         * @param nameAndType NameAndType information
019         */
020        public MethodPoolInfo(ClassPoolInfo clas, NameAndTypePoolInfo nameAndType, ConstantPool cp) {
021            super(CONSTANT_Methodref, clas, nameAndType, cp);
022        }
023    
024        /**
025         * Constructor reading from a stream.
026         *
027         * @param dis input stream
028         * @param cp  constant pool
029         *
030         * @throws IOException
031         */
032        public MethodPoolInfo(DataInputStream dis, ConstantPool cp) throws IOException {
033            super(CONSTANT_Methodref, dis, cp);
034        }
035    
036        /**
037         * Return a human-readable version of this constant pool object.
038         *
039         * @return string
040         */
041        public String toString() {
042            StringBuffer s;
043    
044            s = new StringBuffer();
045            s.append("METHOD: Class = #");
046            s.append(_classInfoIndex);
047            s.append(", Name and type = #");
048            s.append(_nameAndTypeIndex);
049    
050            return s.toString();
051        }
052    
053        /**
054         * Return a human-readable version of this constant pool object.
055         *
056         * @return string
057         */
058        public String toStringVerbose() {
059            return toString();
060        }
061    
062        /**
063         * Compare this object and another one.
064         *
065         * @param obj other object
066         *
067         * @return true if the same
068         */
069        public boolean equals(Object obj) {
070            return (obj instanceof MethodPoolInfo) && (
071                (((MethodPoolInfo)obj)._classInfoIndex == _classInfoIndex) ||
072                (((MethodPoolInfo)obj)._classInfo == _classInfo)
073                ) && (
074                (((MethodPoolInfo)obj)._nameAndTypeIndex == _nameAndTypeIndex) ||
075                (((MethodPoolInfo)obj)._nameAndType == _nameAndType)
076                );
077        }
078    
079        /**
080         * Execute a visitor.
081         *
082         * @param visitor visitor
083         * @param data    visitor-specific parameter
084         *
085         * @return visitor-specific return value
086         */
087        public <R, D> R execute(IPoolInfoVisitor<R, D> visitor, D data) {
088            return visitor.methodCase(this, data);
089        }
090    }