Я только начал использовать javassist, и я не могу понять, как создать экземпляр класса, созданного во время выполнения.Как создать экземпляр класса, созданного во время выполнения с помощью javassist?
Метод makeNewClass()
делает NewClass
класс так:
public bin.objects.base.NewClass {
public int quantity = 5;
private float weight = 30.25f;
public float getWeight() { return weight; }
public void setWeight(float weight) { this.weight = weight; }
public float totalWeight() { return quantity * getWeight(); }
}
Этот метод работает просто отлично:
public void makeNewClass() throws NotFoundException, IOException, CannotCompileException {
// ClassMaker maker holds the CtClass object and handles all the "making"
ClassMaker maker = new ClassMaker("bin.objects.base.NewClass");
maker.addField(CtClass.intType, "quantity", "5", Modifier.PUBLIC);
maker.addField(CtClass.floatType, "weight", "30.25f", Modifier.PRIVATE);
maker.addMethod(Modifier.PUBLIC, CtClass.floatType, "totalWeight", null, null,
"{ return quantity * getWeight(); }", null, MethodType.standard);
maker.getCtClass().writeFile();
}
Теперь начинается проблема. Этот метод должен создать экземпляр NewClass
, получить доступ к его полям e, чтобы вызвать его методы.
public void testNewClass()
throws Throwable {
CtClass ctclass = ClassPool.getDefault().get("bin.objects.base.NovaClasse");
Object testClass = ctclass.toClass(new Loader(), null);
// Throws NoSuchFieldException
Field q = testClass.getClass().getDeclaredField("quantity");
int quantity = (int) q.get(testClass);
Class[] cArg = new Class[1];
cArg[0] = Float.class;
// Throws NoSuchMethodException
Method m = testClass.getClass().getDeclaredMethod("getWeight", cArg);
float weight = (float) m.invoke(testClass, null);
// Throws NoSuchMethodException
m = testClass.getClass().getDeclaredMethod("totalWeight", cArg);
float totalWeight = (float) m.invoke(testClass, null);
System.out.println("quantity = " + quantity +
"weight = " + weight +
"totalWeight = " + totalWeight);
}
Теперь я уже понял, что TestClass это фактически инициализируется как экземпляр java.lang.Class
, не bin.objects.base.NewClass
. Поэтому, очевидно, он не найдет поля и методы NewClass.
Вопрос в том, как я могу это решить? Я пробовал использовать метод java.lang.Class.cast()
, но не имел успеха.
код, кажется, половина переведена половина или может быть jumbling с именами переменных. Не могли бы вы это исправить. – nullpointer
Несомненно. Я пропустил несколько имен в переводе. Я думаю, теперь все в порядке. –