[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[aspectj-users] method <clinit>code size too big problem when weaving
|
Hi,
When my aspectj is weaving to a class which has 3200 advises, eclipse reporting Error "problem generating method packageXX.ClassXX.<clinit> : Code size too big: 78716".
I know this is caused by the limitation of the length of java method can not longer than 64kb.
I modify this class and reduce the number of advises to only 3 and recompile it, and find it will generate a static initial method like below:
static
{
Factory factory = new Factory("StubClass.java", Class.forName("StubClass"));
ajc$tjp_0 = factory.makeSJP("method-call", factory.makeMethodSig("1", "get", "pachageX.ClassX", "java.lang.String:", "string:", "", "java.lang.String"), 13);
ajc$tjp_1 = factory.makeSJP("method-call", factory.makeMethodSig("1", "get",
"pachageX.ClassX", "java.lang.String:", "string:", "", "java.lang.String"), 15);
ajc$tjp_2 = factory.makeSJP("method-call", factory.makeMethodSig("1", "get", "pachageX.ClassX", "java.lang.String:", "string:", "", "java.lang.String"), 18);
}
That means if there are 3200 advises, there will be 3200 statements in the static initial method, which may cause the error.
And below is my around method:
Object around(String var) : aroundGet(var)
{
//proceed(value);
String key = var;
int line = thisJoinPoint.getSourceLocation().getLine();
Object value = findProperties(line, key);
return value;
}
private Object findProperties(int line, String key)
{
Object result = null;
TestData testData =
BaseTestCase.getTestData();
result = testData.getValue(line, key);
return result;
}
And another thing is I find that the logic in the around() method will determine the weaved code, if I just return a random number in the around(), Aspectj will not generate static initial method, under this scenario, the weaving can success is there are 3200 advises.If I change the around() to :
Object around(String var) : aroundGet(var)
{
return new java.util.Random().nextInt(10000);
}
It will generate code like below:
private static final String get_aroundBody4(StubClass stubclass, SomeClass someclass, String s)
{
return someclass.get(s);
}
private static final Object get_aroundBody5$advice(AroundGetMethods
this, String var, AroundClosure ajc_aroundClosure, AroundGetMethods aroundgetmethods, String s, AroundClosure aroundclosure)
{
return Integer.valueOf((new Random()).nextInt(10000));
}
By the way, when I use LTW to weaving this class, aspects generating OutOfMemoryError.
But I think if the problem of static way is solved, the LTW should be OK too.
So how could I solve this problem? Is there some good suggestions?
Thanks for the help.
雅虎邮箱传递新年祝福,个性贺卡送亲朋!