unageanu-javaclass 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/javaclass/accessflag.rb +278 -278
- data/lib/javaclass/attribute.rb +1058 -1058
- data/lib/javaclass/base.rb +368 -368
- data/lib/javaclass/class.rb +281 -281
- data/lib/javaclass/constant.rb +520 -520
- data/lib/javaclass/member.rb +192 -192
- data/lib/javaclass/reader.rb +445 -445
- data/lib/javaclass.rb +7 -7
- data/sample/class_list.rb +38 -8
- data/sample/create_assert.rb +68 -68
- data/sample/sample.rb +26 -26
- data/sample/type_hierarchy.rb +93 -0
- data/test/test_access_flag.rb +205 -205
- data/test/test_attribute.rb +955 -955
- data/test/test_class.rb +90 -90
- data/test/test_constant.rb +830 -830
- data/test/test_member.rb +282 -282
- metadata +2 -1
data/lib/javaclass/member.rb
CHANGED
@@ -1,194 +1,194 @@
|
|
1
|
-
require "javaclass/base"
|
2
|
-
|
3
|
-
module JavaClass
|
4
|
-
|
5
|
-
#
|
6
|
-
#=== Field,Methodの基底クラス
|
7
|
-
#
|
8
|
-
class Member
|
9
|
-
include JavaClass::Base
|
10
|
-
include JavaClass::Converters
|
11
|
-
include JavaClass::Item
|
12
|
-
|
13
|
-
#
|
14
|
-
#===コンストラクタ
|
15
|
-
#
|
16
|
-
#*java_class::メンバーの所有者であるJavaクラス
|
17
|
-
#
|
18
|
-
def initialize( java_class )
|
19
|
-
@java_class = java_class
|
20
|
-
@attributes = {}
|
21
|
-
end
|
22
|
-
#
|
23
|
-
#===名前を取得する。
|
24
|
-
#
|
25
|
-
#<b>戻り値</b>::名前
|
26
|
-
#
|
27
|
-
def name
|
28
|
-
@java_class.get_constant_value(@name_index)
|
29
|
-
end
|
30
|
-
#
|
31
|
-
#===ディスクリプタを取得する。
|
32
|
-
#
|
33
|
-
#<b>戻り値</b>::ディスクリプタ
|
34
|
-
#
|
35
|
-
def descriptor
|
36
|
-
@java_class.get_constant_value(@descriptor_index)
|
37
|
-
end
|
38
|
-
def to_bytes()
|
39
|
-
bytes = @access_flag.to_bytes()
|
40
|
-
bytes += to_byte( @name_index, 2)
|
41
|
-
bytes += to_byte( @descriptor_index, 2)
|
42
|
-
bytes += to_byte( @attributes.size, 2)
|
43
|
-
@attributes.keys.sort!.each {|k|
|
44
|
-
bytes += @attributes[k].to_bytes()
|
45
|
-
}
|
46
|
-
return bytes
|
47
|
-
end
|
48
|
-
# JavaClass
|
49
|
-
attr :java_class, true
|
50
|
-
# アクセスフラグ
|
51
|
-
attr :access_flag, true
|
52
|
-
# 名前を示すconstant_poolのインデックス
|
53
|
-
attr :name_index, true
|
54
|
-
# ディスクリプタを示すconstant_poolのインデックス
|
55
|
-
attr :descriptor_index, true
|
56
|
-
# 属性名をキーとする属性のハッシュ
|
57
|
-
attr :attributes, true
|
58
|
-
end
|
59
|
-
|
60
|
-
#
|
61
|
-
#=== Field
|
62
|
-
#
|
63
|
-
class Field < Member
|
64
|
-
#
|
65
|
-
#===コンストラクタ
|
66
|
-
#
|
67
|
-
#*java_class::Fieldの所有者であるJavaクラス
|
68
|
-
#
|
69
|
-
def initialize( java_class )
|
70
|
-
super( java_class )
|
71
|
-
end
|
72
|
-
#
|
73
|
-
#=== 定数フィールドの初期値を取得する
|
74
|
-
#
|
75
|
-
#<b>戻り値</b>::定数フィールドの初期値。定数でない場合や初期値が設定されていない場合nil
|
76
|
-
#
|
77
|
-
def static_value
|
78
|
-
(attributes.key? "ConstantValue") ? attributes["ConstantValue"].value : nil
|
79
|
-
end
|
80
|
-
def to_s
|
81
|
-
str = ""
|
82
|
-
str << attributes["Signature"].to_s << "\n" if attributes.key? "Signature"
|
83
|
-
str << "// !deprecated!\n" if deprecated?
|
84
|
-
str << annotations.inject( "" ){|s, e| s << e.to_s << "\n" }
|
85
|
-
datas = []
|
86
|
-
datas << access_flag.to_s if access_flag.to_s.length > 0
|
87
|
-
datas << convert_field_descriptor(descriptor)
|
88
|
-
datas << name
|
89
|
-
str << datas.join(" ")
|
90
|
-
str << " = " << attributes["ConstantValue"].to_s if attributes.key? "ConstantValue"
|
91
|
-
return str
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
#
|
96
|
-
#=== Method
|
97
|
-
#
|
98
|
-
class Method < Member
|
99
|
-
#
|
100
|
-
#===コンストラクタ
|
101
|
-
#
|
102
|
-
#*java_class::Methodの所有者であるJavaクラス
|
103
|
-
#
|
104
|
-
def initialize( java_class )
|
105
|
-
super( java_class )
|
106
|
-
end
|
107
|
-
|
108
|
-
#
|
109
|
-
#=== メソッドで発生する例外のクラス名を配列で取得する
|
110
|
-
#
|
111
|
-
#<b>戻り値</b>::メソッドで発生する例外クラス名の配列
|
112
|
-
#
|
113
|
-
def exceptions
|
114
|
-
(attributes.key? "Exceptions") ?
|
115
|
-
attributes["Exceptions"].exceptions.map{|i|i.name} : []
|
116
|
-
end
|
117
|
-
#
|
118
|
-
#=== 引数のクラス名を配列で取得する
|
119
|
-
#
|
120
|
-
#<b>戻り値</b>::引数のクラス名の配列
|
121
|
-
#
|
122
|
-
def parameters
|
123
|
-
convert_method_descriptor( descriptor )[:args]
|
124
|
-
end
|
125
|
-
#
|
126
|
-
#=== メソッドの戻り値クラス名を取得する
|
127
|
-
#
|
128
|
-
#<b>戻り値</b>::メソッドの戻り値クラス名
|
129
|
-
#
|
130
|
-
def return_type
|
131
|
-
convert_method_descriptor( descriptor )[:return]
|
132
|
-
end
|
133
|
-
#
|
134
|
-
#===指定したパラメータに設定されているアノテーションを配列で取得する。
|
135
|
-
#
|
136
|
-
#<b>戻り値</b>::アノテーションの配列
|
137
|
-
#
|
138
|
-
def parameter_annotations(index)
|
139
|
-
['RuntimeVisibleParameterAnnotations',
|
140
|
-
'RuntimeInvisibleParameterAnnotations'].inject([]) { |l, k|
|
141
|
-
l.concat( attributes[k][index] ) if attributes.key? k
|
142
|
-
l
|
143
|
-
}
|
144
|
-
end
|
145
|
-
|
146
|
-
def to_s
|
147
|
-
str = ""
|
148
|
-
str << attributes["Signature"].to_s << "\n" if attributes.key? "Signature"
|
149
|
-
str << "// !deprecated!\n" if deprecated?
|
150
|
-
str << annotations.inject( "" ){|s, e| s << e.to_s << "\n" }
|
151
|
-
d = convert_method_descriptor( descriptor )
|
152
|
-
i = 0
|
153
|
-
args = d[:args].map(){|item|
|
154
|
-
a = parameter_annotations(i)
|
155
|
-
tmp = a.length > 0 ? a.map(){|a| a.to_s}.join("\n") << " " : ""
|
156
|
-
i+=1
|
157
|
-
tmp << "#{item} arg#{i}"
|
158
|
-
}.join(", ")
|
159
|
-
datas = []
|
160
|
-
datas << access_flag.to_s if access_flag.to_s.length > 0
|
161
|
-
datas << d[:return]
|
162
|
-
datas << name
|
163
|
-
datas << "("
|
164
|
-
datas << args
|
165
|
-
datas << ")"
|
166
|
-
str << datas.join(" ")
|
167
|
-
str << "\n" << attributes["Exceptions"].to_s if attributes.key? "Exceptions"
|
168
|
-
if ( attributes.key? "Code")
|
169
|
-
str << " {\n"
|
170
|
-
# codes = attributes["Code"]
|
171
|
-
# local_types = codes.attributes["LocalVariableTypeTable"] if codes.attributes.key? "LocalVariableTypeTable"
|
172
|
-
#
|
173
|
-
# if codes.attributes.key? "LocalVariableTable"
|
174
|
-
# codes.attributes["LocalVariableTable"].local_variable_table.each {|l|
|
175
|
-
# type = local_types.find_by_index(l.index) if local_types != nil
|
176
|
-
# str << " // signature " << type.signature << "\n" if type != nil
|
177
|
-
# str << " " << convert_field_descriptor(l.descriptor)
|
1
|
+
require "javaclass/base"
|
2
|
+
|
3
|
+
module JavaClass
|
4
|
+
|
5
|
+
#
|
6
|
+
#=== Field,Methodの基底クラス
|
7
|
+
#
|
8
|
+
class Member
|
9
|
+
include JavaClass::Base
|
10
|
+
include JavaClass::Converters
|
11
|
+
include JavaClass::Item
|
12
|
+
|
13
|
+
#
|
14
|
+
#===コンストラクタ
|
15
|
+
#
|
16
|
+
#*java_class::メンバーの所有者であるJavaクラス
|
17
|
+
#
|
18
|
+
def initialize( java_class )
|
19
|
+
@java_class = java_class
|
20
|
+
@attributes = {}
|
21
|
+
end
|
22
|
+
#
|
23
|
+
#===名前を取得する。
|
24
|
+
#
|
25
|
+
#<b>戻り値</b>::名前
|
26
|
+
#
|
27
|
+
def name
|
28
|
+
@java_class.get_constant_value(@name_index)
|
29
|
+
end
|
30
|
+
#
|
31
|
+
#===ディスクリプタを取得する。
|
32
|
+
#
|
33
|
+
#<b>戻り値</b>::ディスクリプタ
|
34
|
+
#
|
35
|
+
def descriptor
|
36
|
+
@java_class.get_constant_value(@descriptor_index)
|
37
|
+
end
|
38
|
+
def to_bytes()
|
39
|
+
bytes = @access_flag.to_bytes()
|
40
|
+
bytes += to_byte( @name_index, 2)
|
41
|
+
bytes += to_byte( @descriptor_index, 2)
|
42
|
+
bytes += to_byte( @attributes.size, 2)
|
43
|
+
@attributes.keys.sort!.each {|k|
|
44
|
+
bytes += @attributes[k].to_bytes()
|
45
|
+
}
|
46
|
+
return bytes
|
47
|
+
end
|
48
|
+
# JavaClass
|
49
|
+
attr :java_class, true
|
50
|
+
# アクセスフラグ
|
51
|
+
attr :access_flag, true
|
52
|
+
# 名前を示すconstant_poolのインデックス
|
53
|
+
attr :name_index, true
|
54
|
+
# ディスクリプタを示すconstant_poolのインデックス
|
55
|
+
attr :descriptor_index, true
|
56
|
+
# 属性名をキーとする属性のハッシュ
|
57
|
+
attr :attributes, true
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
#=== Field
|
62
|
+
#
|
63
|
+
class Field < Member
|
64
|
+
#
|
65
|
+
#===コンストラクタ
|
66
|
+
#
|
67
|
+
#*java_class::Fieldの所有者であるJavaクラス
|
68
|
+
#
|
69
|
+
def initialize( java_class )
|
70
|
+
super( java_class )
|
71
|
+
end
|
72
|
+
#
|
73
|
+
#=== 定数フィールドの初期値を取得する
|
74
|
+
#
|
75
|
+
#<b>戻り値</b>::定数フィールドの初期値。定数でない場合や初期値が設定されていない場合nil
|
76
|
+
#
|
77
|
+
def static_value
|
78
|
+
(attributes.key? "ConstantValue") ? attributes["ConstantValue"].value : nil
|
79
|
+
end
|
80
|
+
def to_s
|
81
|
+
str = ""
|
82
|
+
str << attributes["Signature"].to_s << "\n" if attributes.key? "Signature"
|
83
|
+
str << "// !deprecated!\n" if deprecated?
|
84
|
+
str << annotations.inject( "" ){|s, e| s << e.to_s << "\n" }
|
85
|
+
datas = []
|
86
|
+
datas << access_flag.to_s if access_flag.to_s.length > 0
|
87
|
+
datas << convert_field_descriptor(descriptor)
|
88
|
+
datas << name
|
89
|
+
str << datas.join(" ")
|
90
|
+
str << " = " << attributes["ConstantValue"].to_s if attributes.key? "ConstantValue"
|
91
|
+
return str
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
#=== Method
|
97
|
+
#
|
98
|
+
class Method < Member
|
99
|
+
#
|
100
|
+
#===コンストラクタ
|
101
|
+
#
|
102
|
+
#*java_class::Methodの所有者であるJavaクラス
|
103
|
+
#
|
104
|
+
def initialize( java_class )
|
105
|
+
super( java_class )
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
#=== メソッドで発生する例外のクラス名を配列で取得する
|
110
|
+
#
|
111
|
+
#<b>戻り値</b>::メソッドで発生する例外クラス名の配列
|
112
|
+
#
|
113
|
+
def exceptions
|
114
|
+
(attributes.key? "Exceptions") ?
|
115
|
+
attributes["Exceptions"].exceptions.map{|i|i.name} : []
|
116
|
+
end
|
117
|
+
#
|
118
|
+
#=== 引数のクラス名を配列で取得する
|
119
|
+
#
|
120
|
+
#<b>戻り値</b>::引数のクラス名の配列
|
121
|
+
#
|
122
|
+
def parameters
|
123
|
+
convert_method_descriptor( descriptor )[:args]
|
124
|
+
end
|
125
|
+
#
|
126
|
+
#=== メソッドの戻り値クラス名を取得する
|
127
|
+
#
|
128
|
+
#<b>戻り値</b>::メソッドの戻り値クラス名
|
129
|
+
#
|
130
|
+
def return_type
|
131
|
+
convert_method_descriptor( descriptor )[:return]
|
132
|
+
end
|
133
|
+
#
|
134
|
+
#===指定したパラメータに設定されているアノテーションを配列で取得する。
|
135
|
+
#
|
136
|
+
#<b>戻り値</b>::アノテーションの配列
|
137
|
+
#
|
138
|
+
def parameter_annotations(index)
|
139
|
+
['RuntimeVisibleParameterAnnotations',
|
140
|
+
'RuntimeInvisibleParameterAnnotations'].inject([]) { |l, k|
|
141
|
+
l.concat( attributes[k][index] ) if attributes.key? k
|
142
|
+
l
|
143
|
+
}
|
144
|
+
end
|
145
|
+
|
146
|
+
def to_s
|
147
|
+
str = ""
|
148
|
+
str << attributes["Signature"].to_s << "\n" if attributes.key? "Signature"
|
149
|
+
str << "// !deprecated!\n" if deprecated?
|
150
|
+
str << annotations.inject( "" ){|s, e| s << e.to_s << "\n" }
|
151
|
+
d = convert_method_descriptor( descriptor )
|
152
|
+
i = 0
|
153
|
+
args = d[:args].map(){|item|
|
154
|
+
a = parameter_annotations(i)
|
155
|
+
tmp = a.length > 0 ? a.map(){|a| a.to_s}.join("\n") << " " : ""
|
156
|
+
i+=1
|
157
|
+
tmp << "#{item} arg#{i}"
|
158
|
+
}.join(", ")
|
159
|
+
datas = []
|
160
|
+
datas << access_flag.to_s if access_flag.to_s.length > 0
|
161
|
+
datas << d[:return]
|
162
|
+
datas << name
|
163
|
+
datas << "("
|
164
|
+
datas << args
|
165
|
+
datas << ")"
|
166
|
+
str << datas.join(" ")
|
167
|
+
str << "\n" << attributes["Exceptions"].to_s if attributes.key? "Exceptions"
|
168
|
+
if ( attributes.key? "Code")
|
169
|
+
str << " {\n"
|
170
|
+
# codes = attributes["Code"]
|
171
|
+
# local_types = codes.attributes["LocalVariableTypeTable"] if codes.attributes.key? "LocalVariableTypeTable"
|
172
|
+
#
|
173
|
+
# if codes.attributes.key? "LocalVariableTable"
|
174
|
+
# codes.attributes["LocalVariableTable"].local_variable_table.each {|l|
|
175
|
+
# type = local_types.find_by_index(l.index) if local_types != nil
|
176
|
+
# str << " // signature " << type.signature << "\n" if type != nil
|
177
|
+
# str << " " << convert_field_descriptor(l.descriptor)
|
178
178
|
# str << " " << l.name << ";\n"
|
179
|
-
# }
|
180
|
-
# end
|
181
|
-
# str << "\n"
|
182
|
-
# lines = codes.attributes["LineNumberTable"] if codes.attributes.key? "LineNumberTable"
|
183
|
-
# codes.codes.each_index {|i|
|
184
|
-
# str << " " << convert_code(codes.codes[i])
|
185
|
-
# str << " // line : #{lines.line_number(i)}" if lines != nil && lines.line_number(i) != nil
|
186
|
-
# str << "\n";
|
187
|
-
# }
|
188
|
-
str << "}"
|
189
|
-
end
|
190
|
-
str << " #{attributes['AnnotationDefault'].to_s}" if attributes.key? 'AnnotationDefault'
|
191
|
-
return str
|
192
|
-
end
|
193
|
-
end
|
179
|
+
# }
|
180
|
+
# end
|
181
|
+
# str << "\n"
|
182
|
+
# lines = codes.attributes["LineNumberTable"] if codes.attributes.key? "LineNumberTable"
|
183
|
+
# codes.codes.each_index {|i|
|
184
|
+
# str << " " << convert_code(codes.codes[i])
|
185
|
+
# str << " // line : #{lines.line_number(i)}" if lines != nil && lines.line_number(i) != nil
|
186
|
+
# str << "\n";
|
187
|
+
# }
|
188
|
+
str << "}"
|
189
|
+
end
|
190
|
+
str << " #{attributes['AnnotationDefault'].to_s}" if attributes.key? 'AnnotationDefault'
|
191
|
+
return str
|
192
|
+
end
|
193
|
+
end
|
194
194
|
end
|