Safe Haskell | None |
---|
This module declares (low-level) data types for Java .class files structures, and Binary instances to read/write them.
- data Attribute = Attribute {
- attributeName :: Word16
- attributeLength :: Word32
- attributeValue :: ByteString
- data FieldType
- = SignedByte
- | CharByte
- | DoubleType
- | FloatType
- | IntType
- | LongInt
- | ShortInt
- | BoolType
- | ObjectType String
- | Array (Maybe Int) FieldType
- type FieldSignature = FieldType
- data MethodSignature = MethodSignature [ArgumentSignature] ReturnSignature
- data ReturnSignature
- type ArgumentSignature = FieldType
- data File
- data Direct
- type Pool stage = Map Word16 (Constant stage)
- type family Link stage a
- data Method stage = Method {
- methodAccessFlags :: AccessFlags stage
- methodName :: Link stage ByteString
- methodSignature :: Link stage MethodSignature
- methodAttributesCount :: Word16
- methodAttributes :: Attributes stage
- data Field stage = Field {
- fieldAccessFlags :: AccessFlags stage
- fieldName :: Link stage ByteString
- fieldSignature :: Link stage FieldSignature
- fieldAttributesCount :: Word16
- fieldAttributes :: Attributes stage
- data Class stage = Class {
- magic :: Word32
- minorVersion :: Word16
- majorVersion :: Word16
- constsPoolSize :: Word16
- constsPool :: Pool stage
- accessFlags :: AccessFlags stage
- thisClass :: Link stage ByteString
- superClass :: Link stage ByteString
- interfacesCount :: Word16
- interfaces :: [Link stage ByteString]
- classFieldsCount :: Word16
- classFields :: [Field stage]
- classMethodsCount :: Word16
- classMethods :: [Method stage]
- classAttributesCount :: Word16
- classAttributes :: Attributes stage
- data Constant stage
- = CClass (Link stage ByteString)
- | CField (Link stage ByteString) (Link stage (NameType (Field stage)))
- | CMethod (Link stage ByteString) (Link stage (NameType (Method stage)))
- | CIfaceMethod (Link stage ByteString) (Link stage (NameType (Method stage)))
- | CString (Link stage ByteString)
- | CInteger Word32
- | CFloat Float
- | CLong Word64
- | CDouble Double
- | CNameType (Link stage ByteString) (Link stage ByteString)
- | CUTF8 { }
- | CUnicode { }
- data AccessFlag
- type family AccessFlags stage
- data family Attributes stage
- defaultClass :: (Default (AccessFlags stage), Default (Link stage ByteString), Default (Attributes stage)) => Class stage
- class (Binary (Signature a), Show (Signature a), Eq (Signature a)) => HasSignature a where
- type Signature a
- class HasAttributes a where
- attributes :: a stage -> Attributes stage
- data NameType a = NameType {
- ntName :: ByteString
- ntSignature :: Signature a
- fieldNameType :: Field Direct -> NameType (Field Direct)
- methodNameType :: Method Direct -> NameType (Method Direct)
- lookupField :: ByteString -> Class Direct -> Maybe (Field Direct)
- lookupMethod :: ByteString -> Class Direct -> Maybe (Method Direct)
- long :: Constant stage -> Bool
- toString :: ByteString -> String
- className :: Constant Direct -> ByteString
- apsize :: Attributes File -> Int
- arsize :: Attributes Direct -> Int
- arlist :: Attributes Direct -> [(ByteString, ByteString)]
About
Java .class file uses constants pool, which stores almost all source-code-level constants (strings, integer literals etc), and also all identifiers (class, method, field names etc). All other structures contain indexes of constants in the pool instead of constants theirself.
It's not convient to use that indexes programmatically. So, .class file is represented at two stages: File and Direct. At File stage, all data structures contain only indexes, not constants theirself. When we read a class from a file, we get structure at File stage. We only can write File stage structure to file.
At Direct stage, structures conain constants, not indexes. Convertion functions (File - Direct) are located in the JVM.Converter module.
Any (class field method/ ...) attribute format.
Some formats specify special formats for attributeValue
.
Attribute | |
|
Eq Attribute | |
Show Attribute | |
Binary Attribute | |
BinaryState Integer Attribute |
Field signature format
SignedByte | B |
CharByte | C |
DoubleType | D |
FloatType | F |
IntType | I |
LongInt | J |
ShortInt | S |
BoolType | Z |
ObjectType String | L |
Array (Maybe Int) FieldType | [{type} |
Signatures
type FieldSignature = FieldTypeSource
Class field signature
data MethodSignature Source
Class method argument signature
Eq MethodSignature | |
Ord MethodSignature | |
Show MethodSignature | |
Binary MethodSignature |
data ReturnSignature Source
Return value signature
Eq ReturnSignature | |
Ord ReturnSignature | |
Show ReturnSignature | |
Binary ReturnSignature |
type ArgumentSignature = FieldTypeSource
Method argument signature
Stage types
File stage
Direct representation stage
Staged structures
Class method format
Method | |
|
Class field format
Field | |
|
Generic .class file format
Class | |
|
Constant pool item
CClass (Link stage ByteString) | |
CField (Link stage ByteString) (Link stage (NameType (Field stage))) | |
CMethod (Link stage ByteString) (Link stage (NameType (Method stage))) | |
CIfaceMethod (Link stage ByteString) (Link stage (NameType (Method stage))) | |
CString (Link stage ByteString) | |
CInteger Word32 | |
CFloat Float | |
CLong Word64 | |
CDouble Double | |
CNameType (Link stage ByteString) (Link stage ByteString) | |
CUTF8 | |
CUnicode | |
data AccessFlag Source
Access flags. Used for classess, methods, variables.
ACC_PUBLIC | 0x0001 Visible for all |
ACC_PRIVATE | 0x0002 Visible only for defined class |
ACC_PROTECTED | 0x0004 Visible only for subclasses |
ACC_STATIC | 0x0008 Static method or variable |
ACC_FINAL | 0x0010 No further subclassing or assignments |
ACC_SYNCHRONIZED | 0x0020 Uses monitors |
ACC_VOLATILE | 0x0040 Could not be cached |
ACC_TRANSIENT | 0x0080 |
ACC_NATIVE | 0x0100 Implemented in other language |
ACC_INTERFACE | 0x0200 Class is interface |
ACC_ABSTRACT | 0x0400 |
Enum AccessFlag | |
Eq AccessFlag | |
Ord AccessFlag | |
Show AccessFlag |
type family AccessFlags stage Source
Object (class, method, field …) access flags
data family Attributes stage Source
Object (class, method, field) attributes
defaultClass :: (Default (AccessFlags stage), Default (Link stage ByteString), Default (Attributes stage)) => Class stageSource
Default (empty) class file definition.
Misc
class (Binary (Signature a), Show (Signature a), Eq (Signature a)) => HasSignature a Source
Fields and methods have signatures.
class HasAttributes a whereSource
attributes :: a stage -> Attributes stageSource
Name and signature pair. Used for methods and fields.
NameType | |
|
HasSignature a => Eq (NameType a) | |
HasSignature a => Show (NameType a) | |
HasSignature a => Binary (NameType a) |
lookupField :: ByteString -> Class Direct -> Maybe (Field Direct)Source
lookupMethod :: ByteString -> Class Direct -> Maybe (Method Direct)Source
toString :: ByteString -> StringSource
className :: Constant Direct -> ByteStringSource
Name of the CClass. Error on any other constant.
apsize :: Attributes File -> IntSource
Size of attributes set at File stage
arsize :: Attributes Direct -> IntSource
Size of attributes set at Direct stage
arlist :: Attributes Direct -> [(ByteString, ByteString)]Source
Associative list of attributes at Direct stage