[BCEL-info]help with MethodGen...
Brought to you by:
dahm
|
From: Bruce W. <bw...@ef...> - 2002-04-25 17:04:16
|
I am working on a class that will take the union of a set of java
classes. It is sort of like a limited multiple inheritance scheme for
java. I am using the BCEL to create a single class that contains all of
the fields and methods of the given classes. So far, i have it working
for the fields, but the methods are giving me fits.
The relavant section of code is
for(int jj=0; jj< source_classes.length; jj++) {
ConstantPoolGen ucg_cpg = union_class_gen.getConstantPool();
ConstantPoolGen source_pool = new
ConstantPoolGen(source_classes[jj].getConstantPool());
union_class_gen.setConstantPool(combineConstants(ucg_cpg,
source_pool));
Field[] field = source_classes[jj].getFields();
Method[] method = source_classes[jj].getMethods();
for (int kk = 0 ; kk<field.length; kk++) {
FieldGen fg = new FieldGen(field[kk],
union_class_gen.getConstantPool());
if(union_class_gen.containsField(field[kk].getName()) !=
null) fg.setName(source_classes[jj].getClassName() + "_" +
field[kk].getName());
union_class_gen.addField(fg.getField());
}
for ( int kk = 0 ; kk < method.length; kk++ ) {
MethodGen mg = new MethodGen(method[kk], union_class_name
,union_class_gen.getConstantPool() );
if( union_class_gen.containsMethod( method[kk].getName(),
method[kk].getSignature()) != null) {
mg.setName(source_classes[jj].getClassName() + "_" +
method[kk].getName());
}
union_class_gen.getConstantPool().addNameAndType(mg.getName(),
mg.getSignature());
union_class_gen.addMethod(mg.getMethod());
}
}
union_class_gen.getJavaClass().dump(output_file_name);
this seems to go ok, javap will report all the fields and methods have
been added to the new generated class. The problem is when i go to load
the class. I get hung up by the verifier. It complains thusly
Exception in thread "main" java.lang.VerifyError:
(class: C, method: B_setSame signature: (Ljava/lang/String;)V) Illegal type
in constant
pool
As far as i can tell, the constant pool has the correct sig for the
method..
here is a printout of the offending constantpool...
0--> null
1--> CONSTANT_Utf8[1]("SourceFile")
2--> CONSTANT_Utf8[1]("Generated Class")
3--> CONSTANT_Utf8[1]("C")
4--> CONSTANT_Class[7](name_index = 3)
5--> CONSTANT_Utf8[1]("java/lang/Object")
6--> CONSTANT_Class[7](name_index = 5)
7--> CONSTANT_Utf8[1]("<init>")
8--> CONSTANT_Utf8[1]("()V")
9--> CONSTANT_NameAndType[12](name_index = 7, signature_index = 8)
10--> CONSTANT_Methodref[10](class_index = 6, name_and_type_index = 9)
11--> CONSTANT_Utf8[1]("A")
12--> CONSTANT_Class[7](name_index = 11)
13--> CONSTANT_Utf8[1]("aInt")
14--> CONSTANT_Utf8[1]("I")
15--> CONSTANT_NameAndType[12](name_index = 13, signature_index = 14)
16--> CONSTANT_Fieldref[9](class_index = 12, name_and_type_index = 15)
17--> CONSTANT_Utf8[1]("AFloat")
18--> CONSTANT_Utf8[1]("F")
19--> CONSTANT_NameAndType[12](name_index = 17, signature_index = 18)
20--> CONSTANT_Fieldref[9](class_index = 12, name_and_type_index = 19)
21--> CONSTANT_Utf8[1]("same")
22--> CONSTANT_Utf8[1]("Ljava/lang/String;")
23--> CONSTANT_NameAndType[12](name_index = 21, signature_index = 22)
24--> CONSTANT_Fieldref[9](class_index = 12, name_and_type_index = 23)
25--> CONSTANT_Utf8[1]("Code")
26--> CONSTANT_Utf8[1]("LineNumberTable")
27--> CONSTANT_Utf8[1]("getAInt")
28--> CONSTANT_Utf8[1]("()I")
29--> CONSTANT_Utf8[1]("setAInt")
30--> CONSTANT_Utf8[1]("(I)V")
31--> CONSTANT_Utf8[1]("getAFloat")
32--> CONSTANT_Utf8[1]("()F")
33--> CONSTANT_Utf8[1]("setAFloat")
34--> CONSTANT_Utf8[1]("(F)V")
35--> CONSTANT_Utf8[1]("getSame")
36--> CONSTANT_Utf8[1]("()Ljava/lang/String;")
37--> CONSTANT_Utf8[1]("setSame")
38--> CONSTANT_Utf8[1]("(Ljava/lang/String;)V")
39--> CONSTANT_Utf8[1]("A.java")
40--> CONSTANT_Utf8[1]("this")
41--> CONSTANT_Utf8[1]("LC;")
42--> CONSTANT_Utf8[1]("LocalVariableTable")
43--> CONSTANT_NameAndType[12](name_index = 27, signature_index = 28)
44--> CONSTANT_NameAndType[12](name_index = 29, signature_index = 30)
45--> CONSTANT_Utf8[1]("arg0")
46--> CONSTANT_NameAndType[12](name_index = 31, signature_index = 32)
47--> CONSTANT_NameAndType[12](name_index = 33, signature_index = 34)
48--> CONSTANT_NameAndType[12](name_index = 35, signature_index = 36)
49--> CONSTANT_NameAndType[12](name_index = 37, signature_index = 38)
50--> CONSTANT_Utf8[1]("B")
51--> CONSTANT_Class[7](name_index = 50)
52--> CONSTANT_Utf8[1]("bInt")
53--> CONSTANT_NameAndType[12](name_index = 52, signature_index = 14)
54--> CONSTANT_Fieldref[9](class_index = 51, name_and_type_index = 53)
55--> CONSTANT_Utf8[1]("bFloat")
56--> CONSTANT_NameAndType[12](name_index = 55, signature_index = 18)
57--> CONSTANT_Fieldref[9](class_index = 51, name_and_type_index = 56)
58--> CONSTANT_Fieldref[9](class_index = 51, name_and_type_index = 23)
59--> CONSTANT_Utf8[1]("getBInt")
60--> CONSTANT_Utf8[1]("setBInt")
61--> CONSTANT_Utf8[1]("getBFloat")
62--> CONSTANT_Utf8[1]("setBFloat")
63--> CONSTANT_Utf8[1]("B.java")
64--> CONSTANT_Utf8[1]("B_same")
65--> CONSTANT_Utf8[1]("B_<init>")
66--> CONSTANT_NameAndType[12](name_index = 65, signature_index = 8)
67--> CONSTANT_NameAndType[12](name_index = 59, signature_index = 28)
68--> CONSTANT_NameAndType[12](name_index = 60, signature_index = 30)
69--> CONSTANT_NameAndType[12](name_index = 61, signature_index = 32)
70--> CONSTANT_NameAndType[12](name_index = 62, signature_index = 34)
71--> CONSTANT_Utf8[1]("B_getSame")
72--> CONSTANT_NameAndType[12](name_index = 71, signature_index = 36)
73--> CONSTANT_Utf8[1]("B_setSame")
74--> CONSTANT_NameAndType[12](name_index = 73, signature_index = 38)
Any help would be appreciated.
Bruce
--
/* _ * */
/*| |__ _ __ __ __ __ *Bruce M. White*/
/*| '_ \_| ' \ \ V V / *bw...@ef...*/
/*|_.__(_)_|_|_(_)_/\_(_)* */
|