使用Javassist获取类的初始化程序

时间:2013-04-26 22:03:49

标签: java javassist

使用Javassist,我在类之间创建耦合。但是,当我尝试创建一个接受参数的类的实例时,显然存在问题。我真的希望能够获取CtClass的初始化器(如果它们不是空构造函数),然后传入它期望的变量。例如,考虑我试图在A类中创建一个B类实例:

Public class B{
public int foo;
public char spam;
public B(int bar, char eggs){
    foo = bar;
    spam = eggs;
}

}

Public class A{
    B injected = new B(X,X);
}

目前我在类初始值设定项上使用“isEmpty”检查,如果它不为空,我尝试了以下两种方法。两者都给我一个没有这样的构造函数错误:

我认为方法“getClassInitializers”应该将CtClass的构造函数作为数组返回,但我不确定如何处理这个数组,eclipse甚至不会让我声明。我想循环遍历一系列预期参数并制作该类型的虚拟变量,以便我可以执行以下操作:B injected B = new B (13, w);

更糟糕的情况是,我可以在B中创建一个空类初始值设定项,因此我可以injected B = new B();我认为我应该可以使用makeClassInitializer()方法,但这对我不起作用,因为我仍然得到一个没有这样的构造函数错误。

1 个答案:

答案 0 :(得分:1)

解决(种类):

我混淆了构造函数和初始化程序。它可以使用try / catch块,每当它进入catch块时,它就会假定一个非空的类构造函数,在这种情况下它会插入一个空的构造函数:

    try{
    //stuff 

}catch(Exception e){
            //cc is the ctclass object
    CtConstructor blank = new CtConstructor(null, cc); 
    cc.addConstructor(blank);
}

我仍然希望弄清楚如何收集预期的参数而不是注入空的构造函数。