
com.feilong.lib.javassist.bytecode.annotation.AnnotationsWriter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of feilong Show documentation
Show all versions of feilong Show documentation
feilong is a suite of core and expanded libraries that include utility classes, http, excel,cvs, io classes, and much much more.
/*
* Javassist, a Java-bytecode translator toolkit.
* Copyright (C) 1999- Shigeru Chiba. All Rights Reserved.
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. Alternatively, the contents of this file may be used under
* the terms of the GNU Lesser General Public License Version 2.1 or later,
* or the Apache License Version 2.0.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*/
package com.feilong.lib.javassist.bytecode.annotation;
import java.io.IOException;
import java.io.OutputStream;
import com.feilong.lib.javassist.bytecode.ByteArray;
import com.feilong.lib.javassist.bytecode.ConstPool;
/**
* A convenience class for constructing a
* ..Annotations_attribute
.
* See the source code of the AnnotationsAttribute.Copier
class.
*
*
* The following code snippet is an example of use of this class:
*
*
* ConstPool pool = ...;
* output = new ByteArrayOutputStream();
* writer = new AnnotationsWriter(output, pool);
*
* writer.numAnnotations(1);
* writer.annotation("Author", 2);
* writer.memberValuePair("name"); // element_value_pair
* writer.constValueIndex("chiba");
* writer.memberValuePair("address"); // element_value_pair
* writer.constValueIndex("tokyo");
*
* writer.close();
* byte[] attribute_info = output.toByteArray();
* AnnotationsAttribute anno
* = new AnnotationsAttribute(pool, AnnotationsAttribute.visibleTag,
* attribute_info);
*
*
*
* The code snippet above generates the annotation attribute
* corresponding to this annotation:
*
*
* @Author(name = "chiba", address = "tokyo")
*
*
* @see com.feilong.lib.javassist.bytecode.AnnotationsAttribute
* @see com.feilong.lib.javassist.bytecode.ParameterAnnotationsAttribute
*/
public class AnnotationsWriter{
protected OutputStream output;
private final ConstPool pool;
/**
* Constructs with the given output stream.
*
* @param os
* the output stream.
* @param cp
* the constant pool.
*/
public AnnotationsWriter(OutputStream os, ConstPool cp){
output = os;
pool = cp;
}
/**
* Obtains the constant pool given to the constructor.
*/
public ConstPool getConstPool(){
return pool;
}
/**
* Closes the output stream.
*
*/
public void close() throws IOException{
output.close();
}
/**
* Writes num_parameters
in
* Runtime(In)VisibleParameterAnnotations_attribute
.
* This method must be followed by num
calls to
* numAnnotations()
.
*/
public void numParameters(int num) throws IOException{
output.write(num);
}
/**
* Writes num_annotations
in
* Runtime(In)VisibleAnnotations_attribute
.
* This method must be followed by num
calls to
* annotation()
.
*/
public void numAnnotations(int num) throws IOException{
write16bit(num);
}
/**
* Writes annotation
.
* This method must be followed by numMemberValuePairs
* calls to memberValuePair()
.
*
* @param type
* the annotation interface name.
* @param numMemberValuePairs
* num_element_value_pairs
* in annotation
.
*/
public void annotation(String type,int numMemberValuePairs) throws IOException{
annotation(pool.addUtf8Info(type), numMemberValuePairs);
}
/**
* Writes annotation
.
* This method must be followed by numMemberValuePairs
* calls to memberValuePair()
.
*
* @param typeIndex
* type_index
in annotation
.
* @param numMemberValuePairs
* num_element_value_pairs
* in annotation
.
*/
public void annotation(int typeIndex,int numMemberValuePairs) throws IOException{
write16bit(typeIndex);
write16bit(numMemberValuePairs);
}
/**
* Writes an element of a element_value_pairs
array
* in annotation
.
* This method must be followed by a
* call to constValueIndex()
, enumConstValue()
,
* etc.
*
* @param memberName
* the element name.
*/
public void memberValuePair(String memberName) throws IOException{
memberValuePair(pool.addUtf8Info(memberName));
}
/**
* Writes an element of a element_value_pairs
array
* in annotation
.
* This method must be followed by a
* call to constValueIndex()
, enumConstValue()
,
* etc.
*
* @param memberNameIndex
* element_name_index
* in element_value_pairs
array.
*/
public void memberValuePair(int memberNameIndex) throws IOException{
write16bit(memberNameIndex);
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
*/
public void constValueIndex(boolean value) throws IOException{
constValueIndex('Z', pool.addIntegerInfo(value ? 1 : 0));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
*/
public void constValueIndex(byte value) throws IOException{
constValueIndex('B', pool.addIntegerInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
*/
public void constValueIndex(char value) throws IOException{
constValueIndex('C', pool.addIntegerInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
* @throws IOException
*/
public void constValueIndex(short value) throws IOException{
constValueIndex('S', pool.addIntegerInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
* @throws IOException
*/
public void constValueIndex(int value) throws IOException{
constValueIndex('I', pool.addIntegerInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
*/
public void constValueIndex(long value) throws IOException{
constValueIndex('J', pool.addLongInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
*/
public void constValueIndex(float value) throws IOException{
constValueIndex('F', pool.addFloatInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
*/
public void constValueIndex(double value) throws IOException{
constValueIndex('D', pool.addDoubleInfo(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param value
* the constant value.
* @throws IOException
*/
public void constValueIndex(String value) throws IOException{
constValueIndex('s', pool.addUtf8Info(value));
}
/**
* Writes tag
and const_value_index
* in element_value
.
*
* @param tag
* tag
in element_value
.
* @param index
* const_value_index
* in element_value
.
* @throws IOException
*/
public void constValueIndex(int tag,int index) throws IOException{
output.write(tag);
write16bit(index);
}
/**
* Writes tag
and enum_const_value
* in element_value
.
*
* @param typeName
* the type name of the enum constant.
* @param constName
* the simple name of the enum constant.
*/
public void enumConstValue(String typeName,String constName) throws IOException{
enumConstValue(pool.addUtf8Info(typeName), pool.addUtf8Info(constName));
}
/**
* Writes tag
and enum_const_value
* in element_value
.
*
* @param typeNameIndex
* type_name_index
* in element_value
.
* @param constNameIndex
* const_name_index
* in element_value
.
*/
public void enumConstValue(int typeNameIndex,int constNameIndex) throws IOException{
output.write('e');
write16bit(typeNameIndex);
write16bit(constNameIndex);
}
/**
* Writes tag
and class_info_index
* in element_value
.
*
* @param name
* the class name.
*/
public void classInfoIndex(String name) throws IOException{
classInfoIndex(pool.addUtf8Info(name));
}
/**
* Writes tag
and class_info_index
* in element_value
.
*
* @param index
* class_info_index
*/
public void classInfoIndex(int index) throws IOException{
output.write('c');
write16bit(index);
}
/**
* Writes tag
and annotation_value
* in element_value
.
* This method must be followed by a call to annotation()
.
*/
public void annotationValue() throws IOException{
output.write('@');
}
/**
* Writes tag
and array_value
* in element_value
.
* This method must be followed by numValues
calls
* to constValueIndex()
, enumConstValue()
,
* etc.
*
* @param numValues
* num_values
* in array_value
.
*/
public void arrayValue(int numValues) throws IOException{
output.write('[');
write16bit(numValues);
}
protected void write16bit(int value) throws IOException{
byte[] buf = new byte[2];
ByteArray.write16bit(value, buf, 0);
output.write(buf);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy