javaclass 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +208 -23
- data/Readme.txt +56 -19
- data/examples/generate_class_lists.rb +61 -0
- data/history.txt +13 -19
- data/lib/javaclass/classfile/access_flags.rb +52 -0
- data/lib/javaclass/classfile/class_magic.rb +29 -0
- data/lib/javaclass/classfile/class_version.rb +67 -0
- data/lib/javaclass/classfile/constant_pool.rb +91 -0
- data/lib/javaclass/classfile/constants/base.rb +33 -0
- data/lib/javaclass/classfile/constants/double_reference.rb +99 -0
- data/lib/javaclass/classfile/constants/single_reference.rb +65 -0
- data/lib/javaclass/classfile/constants/value.rb +116 -0
- data/lib/javaclass/classfile/java_class_header.rb +102 -0
- data/lib/javaclass/classfile/references.rb +43 -0
- data/lib/javaclass/classlist/class_entry.rb +89 -0
- data/lib/javaclass/classlist/jar_searcher.rb +69 -0
- data/lib/javaclass/classlist/list.rb +126 -0
- data/lib/javaclass/classlist/package_entry.rb +87 -0
- data/lib/javaclass/classpath/classpaths.txt +2 -0
- data/lib/javaclass/classpath/composite_classpath.rb +99 -0
- data/lib/javaclass/classpath/folder_classpath.rb +83 -0
- data/lib/javaclass/classpath/jar_classpath.rb +100 -0
- data/lib/javaclass/classpath/java_home_classpath.rb +40 -0
- data/lib/javaclass/classpath/port_ClassPathEntry.java +202 -0
- data/lib/javaclass/classpath/port_ClassPathEntryFactory.java +311 -0
- data/lib/javaclass/classpath/port_DirectoryRepository.java +24 -0
- data/lib/javaclass/java_name.rb +90 -0
- data/lib/javaclass/metric/ccd.rb +68 -0
- data/lib/javaclass/metric/class_usage.rb +41 -0
- data/lib/javaclass/metric/metrics.txt +15 -0
- data/lib/javaclass.rb +44 -11
- data/test/data/ShortClientData$1-4000Wert.class +0 -0
- data/test/data/{AccessFlagsTestAbstract.class → access_flags/AccessFlagsTestAbstract.class} +0 -0
- data/test/data/{AccessFlagsTestAbstract.java → access_flags/AccessFlagsTestAbstract.java} +0 -0
- data/test/data/{AccessFlagsTestFinal.class → access_flags/AccessFlagsTestFinal.class} +0 -0
- data/test/data/{AccessFlagsTestFinal.java → access_flags/AccessFlagsTestFinal.java} +0 -0
- data/test/data/{AccessFlagsTestInterface.class → access_flags/AccessFlagsTestInterface.class} +0 -0
- data/test/data/{AccessFlagsTestInterface.java → access_flags/AccessFlagsTestInterface.java} +0 -0
- data/test/data/{AccessFlagsTestPackage.class → access_flags/AccessFlagsTestPackage.class} +0 -0
- data/test/data/{AccessFlagsTestPackage.java → access_flags/AccessFlagsTestPackage.java} +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic$Inner.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic$InnerInterface.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic$StaticInner.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPublic.java +11 -0
- data/test/data/access_flags/AccessFlagsTestPublic_javap.txt +29 -0
- data/test/data/{makeAccessFlagsTest.bat → access_flags/make.bat} +0 -0
- data/test/data/{ClassVersionTest.java → class_version/ClassVersionTest.java} +0 -0
- data/test/data/{ClassVersionTest10.class → class_version/ClassVersionTest10.class} +0 -0
- data/test/data/{ClassVersionTest11.class → class_version/ClassVersionTest11.class} +0 -0
- data/test/data/{ClassVersionTest12.class → class_version/ClassVersionTest12.class} +0 -0
- data/test/data/{ClassVersionTest13.class → class_version/ClassVersionTest13.class} +0 -0
- data/test/data/{ClassVersionTest14.class → class_version/ClassVersionTest14.class} +0 -0
- data/test/data/{ClassVersionTest15.class → class_version/ClassVersionTest15.class} +0 -0
- data/test/data/{ClassVersionTest16.class → class_version/ClassVersionTest16.class} +0 -0
- data/test/data/{makeClassVersionTest.bat → class_version/make.bat} +0 -0
- data/test/data/{ConstantPoolTest.class → constant_pool/ConstantPoolTest.class} +0 -0
- data/test/data/{ConstantPoolTest.java → constant_pool/ConstantPoolTest.java} +0 -0
- data/test/data/{makeConstantPoolTest.bat → constant_pool/make.bat} +0 -0
- data/test/data/folder_classpath/JarClasspathTestFolder/ClassVersionTest10.class +0 -0
- data/test/data/folder_classpath/JarClasspathTestFolder/package/ClassVersionTest11.class +0 -0
- data/test/data/jar_classpath/JarClasspathTest.jar +0 -0
- data/test/data/jar_classpath/JarClasspathTest.zip +0 -0
- data/test/data/jar_classpath/JarClasspathTestManifest.jar +0 -0
- data/test/data/jar_classpath/JarClasspathTestMultiManifest.jar +0 -0
- data/test/data/jar_classpath/make.bat +24 -0
- data/test/data/jar_searcher/JarClassListTest.jar +0 -0
- data/test/data/jar_searcher/PublicClass.java +12 -0
- data/test/data/jar_searcher/PublicInterface.java +5 -0
- data/test/data/jar_searcher/make.bat +13 -0
- data/test/data/java_home_classpath/jdk/jre/lib/rt.jar +0 -0
- data/test/data/java_home_classpath/jre/lib/rt.jar +0 -0
- data/test/data/java_home_classpath/jre-ext/lib/ext/ext.jar +0 -0
- data/test/data/java_home_classpath/jre-ext/lib/rt.jar +0 -0
- data/test/data/java_home_classpath/make.bat +13 -0
- data/test/data/references/ReferencesTest.class +0 -0
- data/test/data/references/ReferencesTest.java +12 -0
- data/test/data/references/make.bat +5 -0
- data/test/setup.rb +6 -5
- data/test/test_access_flags.rb +59 -44
- data/test/test_base.rb +20 -15
- data/test/test_class_entry.rb +198 -0
- data/test/test_class_version.rb +48 -46
- data/test/test_composite_classpath.rb +68 -0
- data/test/test_constant_pool.rb +49 -41
- data/test/test_folder_classpath.rb +45 -0
- data/test/test_jar_classpath.rb +57 -0
- data/test/test_jar_searcher.rb +93 -0
- data/test/test_java_class_header.rb +34 -22
- data/test/test_java_home_classpath.rb +50 -0
- data/test/test_java_name.rb +110 -0
- data/test/test_javaclass.rb +22 -0
- data/test/test_list.rb +123 -0
- data/test/test_package_entry.rb +91 -0
- data/test/test_references.rb +38 -20
- data/test/test_string_ux.rb +99 -2
- data/test/ts_all_tests.rb +42 -21
- metadata +171 -50
- data/lib/javaclass/access_flags.rb +0 -44
- data/lib/javaclass/class_magic.rb +0 -27
- data/lib/javaclass/class_version.rb +0 -65
- data/lib/javaclass/constant_pool.rb +0 -85
- data/lib/javaclass/constants/base.rb +0 -31
- data/lib/javaclass/constants/double_reference.rb +0 -81
- data/lib/javaclass/constants/single_reference.rb +0 -58
- data/lib/javaclass/constants/value.rb +0 -114
- data/lib/javaclass/java_class_header.rb +0 -88
- data/lib/javaclass/references.rb +0 -31
- data/test/data/AccessFlagsTestPublic$InnerClass.class +0 -0
- data/test/data/AccessFlagsTestPublic.class +0 -0
- data/test/data/AccessFlagsTestPublic.java +0 -7
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'javaclass/constants/base'
|
2
|
-
|
3
|
-
module JavaClass
|
4
|
-
module Constants # :nodoc:
|
5
|
-
|
6
|
-
# Superclass of single reference constants like +ConstantClass+ (+Class+) in the constant pool.
|
7
|
-
# Author:: Peter Kofler
|
8
|
-
class SingleReference < Base
|
9
|
-
|
10
|
-
attr_reader :first_index
|
11
|
-
|
12
|
-
# Define a single reference into _pool_ from _data_ beginning at _start_
|
13
|
-
def initialize(pool, data, start, name=nil)
|
14
|
-
super(name)
|
15
|
-
@tag = data.u1(start)
|
16
|
-
|
17
|
-
@enclosing_pool = pool
|
18
|
-
@first_index = data.u2(start+1)
|
19
|
-
end
|
20
|
-
|
21
|
-
# Return the value, which is the referenced value from the pool.
|
22
|
-
def first_value
|
23
|
-
get(@first_index)
|
24
|
-
end
|
25
|
-
alias to_s first_value
|
26
|
-
|
27
|
-
# Return part of debug output.
|
28
|
-
def dump
|
29
|
-
super + "##{@first_index};\t// #{to_s}"
|
30
|
-
end
|
31
|
-
|
32
|
-
protected
|
33
|
-
|
34
|
-
# Get a reference _ref_ from the +enclosing_pool+
|
35
|
-
def get(ref)
|
36
|
-
@enclosing_pool[ref].to_s
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
class ConstantClass < SingleReference
|
42
|
-
alias name_index first_index
|
43
|
-
def initialize(pool, data, start)
|
44
|
-
super(pool, data, start, "class")
|
45
|
-
end
|
46
|
-
alias class_name first_value
|
47
|
-
end
|
48
|
-
|
49
|
-
class ConstantString < SingleReference
|
50
|
-
alias string_index first_index
|
51
|
-
def initialize(pool, data, start)
|
52
|
-
super(pool, data, start)
|
53
|
-
end
|
54
|
-
alias string_value first_value
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
@@ -1,114 +0,0 @@
|
|
1
|
-
require 'javaclass/constants/base'
|
2
|
-
|
3
|
-
module JavaClass
|
4
|
-
module Constants # :nodoc:
|
5
|
-
|
6
|
-
# Superclass of value constants like +ConstantInt+ (+Integer+) in the constant pool.
|
7
|
-
# Author:: Peter Kofler
|
8
|
-
class Value < Base
|
9
|
-
|
10
|
-
attr_reader :value
|
11
|
-
|
12
|
-
# Create a constant value with an optional downcase _name_
|
13
|
-
def initialize(name=self.class.to_s[/::[^:]+$/][10..-1].downcase)
|
14
|
-
super(name)
|
15
|
-
end
|
16
|
-
|
17
|
-
# Return the value as string.
|
18
|
-
def to_s
|
19
|
-
@value.to_s
|
20
|
-
end
|
21
|
-
|
22
|
-
# Return part of debug output.
|
23
|
-
def dump
|
24
|
-
super + "#{@value}"
|
25
|
-
end
|
26
|
-
|
27
|
-
protected
|
28
|
-
|
29
|
-
# Define a +value+ from _data_ beginning at position _start_ with the _size_ in bytes and _slots_ (1 or 2).
|
30
|
-
def get_value(data, start, size, slots=1)
|
31
|
-
@tag = data.u1(start)
|
32
|
-
@size = size
|
33
|
-
@slots = slots
|
34
|
-
|
35
|
-
data[start+1..start+size-1]
|
36
|
-
end
|
37
|
-
|
38
|
-
# Dummy method to "fix" unused warning of param _pool_ in Eclipse.
|
39
|
-
def silence_unused_warning(pool)
|
40
|
-
raise "pool is nil" unless pool
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
class ConstantInt < Value
|
46
|
-
def initialize(pool, data, start)
|
47
|
-
super()
|
48
|
-
silence_unused_warning(pool)
|
49
|
-
@value = get_value(data, start, 5).u4
|
50
|
-
end
|
51
|
-
|
52
|
-
def dump
|
53
|
-
super + ';'
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class ConstantFloat < Value
|
58
|
-
def initialize(pool, data, start)
|
59
|
-
super()
|
60
|
-
silence_unused_warning(pool)
|
61
|
-
@value = get_value(data, start, 5).single
|
62
|
-
end
|
63
|
-
def to_s
|
64
|
-
super.upcase # sprintf('%E',@value)
|
65
|
-
end
|
66
|
-
def dump
|
67
|
-
super + 'f;'
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
class ConstantLong < Value
|
72
|
-
def initialize(pool, data, start)
|
73
|
-
super()
|
74
|
-
silence_unused_warning(pool)
|
75
|
-
@value = get_value(data, start, 9, 2).u8
|
76
|
-
end
|
77
|
-
def dump
|
78
|
-
super + 'l;'
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
class ConstantDouble < Value
|
83
|
-
def initialize(pool, data, start)
|
84
|
-
super()
|
85
|
-
silence_unused_warning(pool)
|
86
|
-
@value = get_value(data, start, 9, 2).double
|
87
|
-
end
|
88
|
-
def to_s
|
89
|
-
@value.to_s.upcase # sprintf('%E',@value)
|
90
|
-
end
|
91
|
-
def dump
|
92
|
-
super + 'd;'
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class ConstantAsciz < Value
|
97
|
-
alias string value
|
98
|
-
def initialize(pool, data, start)
|
99
|
-
super('Asciz')
|
100
|
-
silence_unused_warning(pool)
|
101
|
-
@tag = data.u1(start)
|
102
|
-
|
103
|
-
@length = data.u2(start+1)
|
104
|
-
@size = 3 + @length
|
105
|
-
@value = data[start+3..start+3+@length-1]
|
106
|
-
end
|
107
|
-
|
108
|
-
def dump
|
109
|
-
super + ';'
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'javaclass/string_ux'
|
2
|
-
require 'javaclass/class_magic'
|
3
|
-
require 'javaclass/class_version'
|
4
|
-
require 'javaclass/constant_pool'
|
5
|
-
require 'javaclass/references'
|
6
|
-
require 'javaclass/access_flags'
|
7
|
-
|
8
|
-
module JavaClass
|
9
|
-
|
10
|
-
# Provide all information of a Java class file.
|
11
|
-
# Author:: Peter Kofler
|
12
|
-
class JavaClassHeader
|
13
|
-
|
14
|
-
attr_reader :magic
|
15
|
-
attr_reader :version
|
16
|
-
attr_reader :constant_pool
|
17
|
-
attr_reader :access_flags
|
18
|
-
attr_reader :references
|
19
|
-
|
20
|
-
# Create a header with the binary _data_ from the class file.
|
21
|
-
def initialize(data)
|
22
|
-
|
23
|
-
# ClassFile {
|
24
|
-
# u4 magic;
|
25
|
-
# u2 minor_version;
|
26
|
-
# u2 major_version;
|
27
|
-
# u2 constant_pool_count;
|
28
|
-
# cp_info constant_pool[constant_pool_count-1];
|
29
|
-
# u2 access_flags;
|
30
|
-
# u2 this_class;
|
31
|
-
# u2 super_class;
|
32
|
-
# u2 interfaces_count;
|
33
|
-
# u2 interfaces[interfaces_count];
|
34
|
-
# u2 fields_count;
|
35
|
-
# field_info fields[fields_count];
|
36
|
-
# u2 methods_count;
|
37
|
-
# method_info methods[methods_count];
|
38
|
-
# u2 attributes_count;
|
39
|
-
# attribute_info attributes[attributes_count];
|
40
|
-
# }
|
41
|
-
|
42
|
-
@magic = ClassMagic.new(data)
|
43
|
-
@version = ClassVersion.new(data)
|
44
|
-
|
45
|
-
@constant_pool = ConstantPool.new(data)
|
46
|
-
pos = 8 + @constant_pool.size
|
47
|
-
|
48
|
-
@access_flags = AccessFlags.new(data, pos)
|
49
|
-
pos += 2
|
50
|
-
|
51
|
-
idx = data.u2(pos)
|
52
|
-
pos += 2
|
53
|
-
@this_class_idx = idx
|
54
|
-
|
55
|
-
@references = References.new(@constant_pool, @this_class_idx)
|
56
|
-
|
57
|
-
idx = data.u2(pos)
|
58
|
-
pos += 2
|
59
|
-
@super_class_idx = idx
|
60
|
-
end
|
61
|
-
|
62
|
-
# Return the name of this class.
|
63
|
-
def this_class
|
64
|
-
@constant_pool[@this_class_idx].to_s
|
65
|
-
end
|
66
|
-
|
67
|
-
# Return the name of the superclass of this class or +nil+.
|
68
|
-
def super_class
|
69
|
-
if @super_class_idx>0
|
70
|
-
@constant_pool[@super_class_idx].to_s
|
71
|
-
else
|
72
|
-
nil
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# Return a debug output of this class that looks similar to +javap+ output.
|
77
|
-
def dump
|
78
|
-
d = []
|
79
|
-
# dump << " SourceFile: \"#{@value}\""
|
80
|
-
# dump << "Compiled from \"#{@value}\""
|
81
|
-
d += @version.dump
|
82
|
-
d += @constant_pool.dump
|
83
|
-
d
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
data/lib/javaclass/references.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'javaclass/constant_pool'
|
2
|
-
|
3
|
-
module JavaClass
|
4
|
-
|
5
|
-
# Container class for list of all classes, methods and fields referenced by this class.
|
6
|
-
# Author:: Peter Kofler
|
7
|
-
class References
|
8
|
-
|
9
|
-
# Create a references container with the constant _pool_ and skip references to _classidx_ which is the host class itself.
|
10
|
-
def initialize(pool, classidx)
|
11
|
-
@constant_pool = pool
|
12
|
-
@class_idx = classidx
|
13
|
-
end
|
14
|
-
|
15
|
-
# Return the constants referring to fields (Constants::ConstantField).
|
16
|
-
# If _includeown_ is +true+ then fields of this class are returned also.
|
17
|
-
def referenced_fields(includeown=false)
|
18
|
-
@constant_pool.find(ConstantPool::FIELD_TAG).find_all { |field| includeown || field.class_index != @class_idx }
|
19
|
-
end
|
20
|
-
|
21
|
-
# Return the constants referring to methods (Constants::ConstantMethod) in classes or interfaces.
|
22
|
-
# If _includeown_ is +true+ then methods of this class are returned also.
|
23
|
-
def referenced_methods(includeown=false)
|
24
|
-
@constant_pool.find(ConstantPool::METHOD_TAG, ConstantPool::INTERFACE_METHOD_TAG).find_all do |method|
|
25
|
-
includeown || method.class_index != @class_idx
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
Binary file
|
Binary file
|