public class Clazz
extends java.lang.Object
Modifier and Type | Class and Description |
---|---|
protected static class |
Clazz.Assoc |
class |
Clazz.ClassConstant |
(package private) static class |
Clazz.CONSTANT |
class |
Clazz.Def |
class |
Clazz.FieldDef |
static class |
Clazz.JAVA |
class |
Clazz.MethodDef |
static class |
Clazz.QUERY |
class |
Clazz.TypeDef |
Modifier and Type | Field and Description |
---|---|
(package private) static int |
ACC_ABSTRACT |
(package private) static int |
ACC_ANNOTATION |
(package private) static int |
ACC_BRIDGE |
(package private) static int |
ACC_ENUM |
(package private) static int |
ACC_FINAL |
(package private) static int |
ACC_INTERFACE |
(package private) static int |
ACC_MODULE |
(package private) static int |
ACC_PUBLIC
ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its
package.
|
(package private) static int |
ACC_SUPER |
(package private) static int |
ACC_SYNTHETIC |
(package private) int |
accessx |
(package private) Analyzer |
analyzer |
(package private) java.util.Set<Descriptors.TypeRef> |
annotations |
(package private) java.util.Set<Descriptors.PackageRef> |
api |
(package private) ClassDataCollector |
cd |
(package private) java.util.Deque<ClassDataCollector> |
cds |
(package private) int |
class$ |
(package private) Descriptors.TypeRef |
className |
(package private) java.lang.String |
classSignature |
private java.util.Map<java.lang.String,java.lang.Object> |
defaults |
(package private) boolean |
deprecated |
(package private) int |
depth |
private boolean |
detectLdc |
(package private) int |
forName |
static java.util.EnumSet<Clazz.QUERY> |
HAS_ARGUMENT |
(package private) boolean |
hasClassAnnotations |
(package private) boolean |
hasDefaultConstructor |
(package private) boolean |
hasRuntimeAnnotations |
(package private) java.util.Set<Descriptors.PackageRef> |
imports |
(package private) int |
innerAccess |
(package private) Descriptors.TypeRef[] |
interfaces |
(package private) int[] |
intPool |
(package private) Clazz.FieldDef |
last |
private static org.slf4j.Logger |
logger |
(package private) int |
major |
(package private) static java.util.regex.Pattern |
METHOD_DESCRIPTOR |
(package private) int |
minor |
static java.util.Comparator<Clazz> |
NAME_COMPARATOR |
(package private) java.lang.String |
path |
(package private) java.lang.Object[] |
pool |
(package private) Resource |
resource |
(package private) java.lang.String |
sourceFile |
(package private) java.util.Set<Descriptors.TypeRef> |
xref |
(package private) Descriptors.TypeRef |
zuper |
Constructor and Description |
---|
Clazz(Analyzer analyzer,
java.lang.String path,
Resource resource) |
Modifier and Type | Method and Description |
---|---|
private void |
classConstRef(int lastReference) |
private void |
constantClass(java.io.DataInput in,
int poolIndex) |
private void |
constantDouble(java.io.DataInput in,
int poolIndex) |
private void |
constantFloat(java.io.DataInput in,
int poolIndex) |
private void |
constantInteger(java.io.DataInput in,
int poolIndex) |
private void |
constantLong(java.io.DataInput in,
int poolIndex) |
private void |
constantString(java.io.DataInput in,
int poolIndex) |
private void |
constantUtf8(java.io.DataInput in,
int poolIndex) |
private void |
crawl(byte[] code)
We must find Class.forName references ...
|
private Annotation |
doAnnotation(java.io.DataInput in,
java.lang.annotation.ElementType member,
java.lang.annotation.RetentionPolicy policy,
boolean collect,
int access_flags) |
private void |
doAnnotations(java.io.DataInput in,
java.lang.annotation.ElementType member,
java.lang.annotation.RetentionPolicy policy,
int access_flags) |
private void |
doAttribute(java.io.DataInput in,
java.lang.annotation.ElementType member,
boolean crawl,
int access_flags)
Process a single attribute, if not recognized, skip it.
|
private void |
doAttributes(java.io.DataInput in,
java.lang.annotation.ElementType member,
boolean crawl,
int access_flags)
Called for each attribute in the class, field, or method.
|
private void |
doBootstrapMethods(java.io.DataInput in) |
private void |
doCode(java.io.DataInput in,
boolean crawl)
Code_attribute { u2 attribute_name_index; u4 attribute_length; u2
max_stack; u2 max_locals; u4 code_length; u1 code[code_length]; u2
exception_table_length; { u2 start_pc; u2 end_pc; u2 handler_pc; u2
catch_type; } exception_table[exception_table_length]; u2
attributes_count; attribute_info attributes[attributes_count]; }
|
(package private) void |
doConstantValue(java.io.DataInput in)
Handle a constant value call the data collector with it
|
private java.lang.Object |
doElementValue(java.io.DataInput in,
java.lang.annotation.ElementType member,
java.lang.annotation.RetentionPolicy policy,
boolean collect,
int access_flags) |
private void |
doEnclosingMethod(java.io.DataInput in)
EnclosingMethod_attribute { u2 attribute_name_index; u4
attribute_length; u2 class_index u2 method_index; }
|
(package private) void |
doExceptions(java.io.DataInput in,
int access_flags) |
private void |
doInnerClasses(java.io.DataInput in)
InnerClasses_attribute { u2 attribute_name_index; u4
attribute_length; u2 number_of_classes; { u2 inner_class_info_index; u2
outer_class_info_index; u2 inner_name_index; u2 inner_class_access_flags;
} classes[number_of_classes]; }
|
private void |
doParameterAnnotations(java.io.DataInput in,
java.lang.annotation.ElementType member,
java.lang.annotation.RetentionPolicy policy,
int access_flags) |
(package private) void |
doSignature(java.io.DataInput in,
java.lang.annotation.ElementType member,
int access_flags)
Handle a signature
|
private void |
doSourceFile(java.io.DataInput in) |
private void |
doStackMapTable(java.io.DataInput in) |
private void |
doTypeAnnotations(java.io.DataInput in,
java.lang.annotation.ElementType member,
java.lang.annotation.RetentionPolicy policy,
int access_flags) |
private int |
findMethodReference(java.lang.String clazz,
java.lang.String methodname,
java.lang.String descriptor)
Find a method reference in the pool that points to the given class,
methodname and descriptor.
|
java.lang.String |
getAbsolutePath() |
int |
getAccess() |
java.util.Set<Descriptors.PackageRef> |
getAPIUses() |
Descriptors.TypeRef |
getClassName() |
java.lang.String |
getClassSignature() |
java.util.Map<java.lang.String,java.lang.Object> |
getDefaults() |
Clazz.TypeDef |
getExtends(Descriptors.TypeRef type) |
Clazz.JAVA |
getFormat() |
java.lang.String |
getFQN() |
Clazz.TypeDef |
getImplements(Descriptors.TypeRef type) |
Descriptors.TypeRef[] |
getInterfaces() |
(package private) void |
getMethodDef(int access,
int methodRefPoolIndex)
Called when crawling the byte code and a method reference is found
|
Clazz.MethodDef |
getMethodDef(int access,
java.lang.String name,
java.lang.String descriptor)
To provide an enclosing instance
|
java.util.Set<Descriptors.PackageRef> |
getReferred() |
java.lang.String |
getSourceFile() |
Descriptors.TypeRef |
getSuper() |
boolean |
hasPublicNoArgsConstructor() |
private void |
invokeDynamic(java.io.DataInput in,
int poolIndex,
Clazz.CONSTANT tag) |
boolean |
is(Clazz.QUERY query,
Instruction instr,
Analyzer analyzer) |
boolean |
isAbstract() |
boolean |
isAnnotation() |
boolean |
isDeprecated() |
boolean |
isEnum() |
boolean |
isFinal() |
boolean |
isInterface() |
boolean |
isModule() |
boolean |
isProtected() |
boolean |
isPublic() |
boolean |
isSynthetic() |
private void |
methodHandle(java.io.DataInput in,
int poolIndex,
Clazz.CONSTANT tag) |
private void |
methodType(java.io.DataInput in,
int poolIndex,
Clazz.CONSTANT tag) |
private void |
nameAndType(java.io.DataInput in,
int poolIndex,
Clazz.CONSTANT tag) |
static java.lang.String |
objectDescriptorToFQN(java.lang.String string) |
java.util.Set<Descriptors.TypeRef> |
parseClassFile() |
java.util.Set<Descriptors.TypeRef> |
parseClassFile(java.io.InputStream in) |
java.util.Set<Descriptors.TypeRef> |
parseClassFile(java.io.InputStream in,
ClassDataCollector cd) |
(package private) java.util.Set<Descriptors.TypeRef> |
parseClassFileData(java.io.DataInput in) |
(package private) java.util.Set<Descriptors.TypeRef> |
parseClassFileData(java.io.DataInput in,
ClassDataCollector cd) |
java.util.Set<Descriptors.TypeRef> |
parseClassFileWithCollector(ClassDataCollector cd) |
void |
parseDescriptor(java.lang.String descriptor,
int modifiers)
This method parses a descriptor and adds the package of the descriptor to
the referenced packages.
|
private int |
parseFormalTypeParameters(java.lang.String descriptor,
int index,
int modifiers)
FormalTypeParameters
|
(package private) int |
parseReference(java.lang.String descriptor,
int rover,
int modifiers)
Parse a single reference.
|
(package private) int |
parseReferences(java.lang.String descriptor,
int rover,
char delimiter,
int modifiers)
Parse a sequence of references.
|
private void |
pool(java.lang.Object[] pool,
int[] intPool) |
private void |
ref(java.io.DataInput in,
int poolIndex) |
(package private) void |
referTo(Descriptors.TypeRef typeRef,
int modifiers)
Add a new package reference.
|
(package private) void |
referTo(int index,
int modifiers) |
void |
reset()
.class construct for different compilers sun 1.1 Detect static variable
class$com$acme$MyClass 1.2 " 1.3 " 1.4 " 1.5 ldc_w (class) 1.6 " eclipse
1.1 class$0, ldc (string), invokestatic Class.forName 1.2 " 1.3 " 1.5 ldc
(class) 1.6 " 1.5 and later is not an issue, sun pre 1.5 is easy to
detect the static variable that decodes the class name.
|
void |
setDeprecated(boolean b) |
void |
setInnerAccess(int access) |
java.lang.String |
toString() |
static java.lang.String |
unCamel(java.lang.String id) |
private void |
verification_type_info(java.io.DataInput in) |
private static final org.slf4j.Logger logger
static java.util.regex.Pattern METHOD_DESCRIPTOR
public static final java.util.EnumSet<Clazz.QUERY> HAS_ARGUMENT
static final int ACC_PUBLIC
ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its package. ACC_FINAL 0x0010 Declared final; no subclasses allowed. ACC_SUPER 0x0020 Treat superclass methods specially when invoked by the invokespecial instruction. ACC_INTERFACE 0x0200 Is an interface, not a class. ACC_ABSTRACT 0x0400 Declared abstract; may not be instantiated.
static final int ACC_FINAL
static final int ACC_SUPER
static final int ACC_INTERFACE
static final int ACC_ABSTRACT
static final int ACC_SYNTHETIC
static final int ACC_BRIDGE
static final int ACC_ANNOTATION
static final int ACC_ENUM
static final int ACC_MODULE
public static final java.util.Comparator<Clazz> NAME_COMPARATOR
boolean hasRuntimeAnnotations
boolean hasClassAnnotations
boolean hasDefaultConstructor
int depth
java.util.Deque<ClassDataCollector> cds
Descriptors.TypeRef className
java.lang.Object[] pool
int[] intPool
java.util.Set<Descriptors.PackageRef> imports
java.lang.String path
int minor
int major
int innerAccess
int accessx
java.lang.String sourceFile
java.util.Set<Descriptors.TypeRef> xref
java.util.Set<Descriptors.TypeRef> annotations
int forName
int class$
Descriptors.TypeRef[] interfaces
Descriptors.TypeRef zuper
ClassDataCollector cd
Resource resource
Clazz.FieldDef last
boolean deprecated
java.util.Set<Descriptors.PackageRef> api
final Analyzer analyzer
java.lang.String classSignature
private boolean detectLdc
private java.util.Map<java.lang.String,java.lang.Object> defaults
public java.util.Set<Descriptors.TypeRef> parseClassFile() throws java.lang.Exception
java.lang.Exception
public java.util.Set<Descriptors.TypeRef> parseClassFile(java.io.InputStream in) throws java.lang.Exception
java.lang.Exception
public java.util.Set<Descriptors.TypeRef> parseClassFileWithCollector(ClassDataCollector cd) throws java.lang.Exception
java.lang.Exception
public java.util.Set<Descriptors.TypeRef> parseClassFile(java.io.InputStream in, ClassDataCollector cd) throws java.lang.Exception
java.lang.Exception
java.util.Set<Descriptors.TypeRef> parseClassFileData(java.io.DataInput in, ClassDataCollector cd) throws java.lang.Exception
java.lang.Exception
java.util.Set<Descriptors.TypeRef> parseClassFileData(java.io.DataInput in) throws java.lang.Exception
java.lang.Exception
private void constantFloat(java.io.DataInput in, int poolIndex) throws java.io.IOException
java.io.IOException
private void constantInteger(java.io.DataInput in, int poolIndex) throws java.io.IOException
java.io.IOException
private void pool(java.lang.Object[] pool, int[] intPool)
private void nameAndType(java.io.DataInput in, int poolIndex, Clazz.CONSTANT tag) throws java.io.IOException
in
- poolIndex
- tag
- java.io.IOException
private void methodType(java.io.DataInput in, int poolIndex, Clazz.CONSTANT tag) throws java.io.IOException
in
- poolIndex
- tag
- java.io.IOException
private void methodHandle(java.io.DataInput in, int poolIndex, Clazz.CONSTANT tag) throws java.io.IOException
in
- poolIndex
- tag
- java.io.IOException
private void invokeDynamic(java.io.DataInput in, int poolIndex, Clazz.CONSTANT tag) throws java.io.IOException
in
- poolIndex
- tag
- java.io.IOException
private void ref(java.io.DataInput in, int poolIndex) throws java.io.IOException
in
- poolIndex
- java.io.IOException
private void constantString(java.io.DataInput in, int poolIndex) throws java.io.IOException
in
- poolIndex
- java.io.IOException
private void constantClass(java.io.DataInput in, int poolIndex) throws java.io.IOException
in
- poolIndex
- java.io.IOException
private void constantDouble(java.io.DataInput in, int poolIndex) throws java.io.IOException
in
- java.io.IOException
private void constantLong(java.io.DataInput in, int poolIndex) throws java.io.IOException
in
- java.io.IOException
private void constantUtf8(java.io.DataInput in, int poolIndex) throws java.io.IOException
in
- poolIndex
- java.io.IOException
private int findMethodReference(java.lang.String clazz, java.lang.String methodname, java.lang.String descriptor)
clazz
- methodname
- descriptor
- private void doAttributes(java.io.DataInput in, java.lang.annotation.ElementType member, boolean crawl, int access_flags) throws java.lang.Exception
in
- The streamaccess_flags
- java.lang.Exception
private void doAttribute(java.io.DataInput in, java.lang.annotation.ElementType member, boolean crawl, int access_flags) throws java.lang.Exception
in
- the data streamaccess_flags
- java.lang.Exception
private void doEnclosingMethod(java.io.DataInput in) throws java.io.IOException
EnclosingMethod_attribute { u2 attribute_name_index; u4 attribute_length; u2 class_index u2 method_index; }
in
- java.io.IOException
private void doInnerClasses(java.io.DataInput in) throws java.lang.Exception
InnerClasses_attribute { u2 attribute_name_index; u4 attribute_length; u2 number_of_classes; { u2 inner_class_info_index; u2 outer_class_info_index; u2 inner_name_index; u2 inner_class_access_flags; } classes[number_of_classes]; }
in
- java.lang.Exception
void doSignature(java.io.DataInput in, java.lang.annotation.ElementType member, int access_flags) throws java.io.IOException
Signature_attribute { u2 attribute_name_index; u4 attribute_length; u2 signature_index; }
member
- access_flags
- java.io.IOException
void doConstantValue(java.io.DataInput in) throws java.io.IOException
java.io.IOException
void doExceptions(java.io.DataInput in, int access_flags) throws java.io.IOException
java.io.IOException
private void doCode(java.io.DataInput in, boolean crawl) throws java.lang.Exception
Code_attribute { u2 attribute_name_index; u4 attribute_length; u2 max_stack; u2 max_locals; u4 code_length; u1 code[code_length]; u2 exception_table_length; { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } exception_table[exception_table_length]; u2 attributes_count; attribute_info attributes[attributes_count]; }
in
- pool
- java.lang.Exception
private void crawl(byte[] code)
code
- private void doSourceFile(java.io.DataInput in) throws java.io.IOException
java.io.IOException
private void doParameterAnnotations(java.io.DataInput in, java.lang.annotation.ElementType member, java.lang.annotation.RetentionPolicy policy, int access_flags) throws java.lang.Exception
java.lang.Exception
private void doTypeAnnotations(java.io.DataInput in, java.lang.annotation.ElementType member, java.lang.annotation.RetentionPolicy policy, int access_flags) throws java.lang.Exception
java.lang.Exception
private void doAnnotations(java.io.DataInput in, java.lang.annotation.ElementType member, java.lang.annotation.RetentionPolicy policy, int access_flags) throws java.lang.Exception
java.lang.Exception
private Annotation doAnnotation(java.io.DataInput in, java.lang.annotation.ElementType member, java.lang.annotation.RetentionPolicy policy, boolean collect, int access_flags) throws java.io.IOException
java.io.IOException
private java.lang.Object doElementValue(java.io.DataInput in, java.lang.annotation.ElementType member, java.lang.annotation.RetentionPolicy policy, boolean collect, int access_flags) throws java.io.IOException
java.io.IOException
private void doBootstrapMethods(java.io.DataInput in) throws java.io.IOException
java.io.IOException
private void doStackMapTable(java.io.DataInput in) throws java.io.IOException
java.io.IOException
private void verification_type_info(java.io.DataInput in) throws java.io.IOException
java.io.IOException
void referTo(Descriptors.TypeRef typeRef, int modifiers)
packageRef
- A '.' delimited package namevoid referTo(int index, int modifiers)
public void parseDescriptor(java.lang.String descriptor, int modifiers)
descriptor ::= ( '(' reference * ')' )? reference reference ::= 'L' classname ( '<' references '>' )? ';' | 'B' | 'Z' | ... | '+' | '-' | '['This methods uses heavy recursion to parse the descriptor and a roving pointer to limit the creation of string objects.
descriptor
- The to be parsed descriptormodifiers
- int parseReferences(java.lang.String descriptor, int rover, char delimiter, int modifiers)
descriptor
- The whole descriptor.rover
- The index in the descriptordelimiter
- The end character or 0int parseReference(java.lang.String descriptor, int rover, int modifiers)
descriptor
- The descriptorrover
- The place to startprivate int parseFormalTypeParameters(java.lang.String descriptor, int index, int modifiers)
descriptor
- index
- public java.util.Set<Descriptors.PackageRef> getReferred()
public java.lang.String getAbsolutePath()
public java.lang.String getSourceFile()
public void reset()
public boolean is(Clazz.QUERY query, Instruction instr, Analyzer analyzer) throws java.lang.Exception
java.lang.Exception
public java.lang.String toString()
toString
in class java.lang.Object
void getMethodDef(int access, int methodRefPoolIndex)
public boolean isPublic()
public boolean isProtected()
public boolean isEnum()
public boolean isSynthetic()
public boolean isModule()
public Clazz.JAVA getFormat()
public static java.lang.String objectDescriptorToFQN(java.lang.String string)
public static java.lang.String unCamel(java.lang.String id)
public boolean isInterface()
public boolean isAbstract()
public boolean hasPublicNoArgsConstructor()
public int getAccess()
public Descriptors.TypeRef getClassName()
public Clazz.MethodDef getMethodDef(int access, java.lang.String name, java.lang.String descriptor)
access
- name
- descriptor
- public Descriptors.TypeRef getSuper()
public java.lang.String getFQN()
public Descriptors.TypeRef[] getInterfaces()
public void setInnerAccess(int access)
public boolean isFinal()
public void setDeprecated(boolean b)
public boolean isDeprecated()
public boolean isAnnotation()
public java.util.Set<Descriptors.PackageRef> getAPIUses()
public Clazz.TypeDef getExtends(Descriptors.TypeRef type)
public Clazz.TypeDef getImplements(Descriptors.TypeRef type)
private void classConstRef(int lastReference)
public java.lang.String getClassSignature()
public java.util.Map<java.lang.String,java.lang.Object> getDefaults() throws java.lang.Exception
java.lang.Exception