방금 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
을 인스턴스화하고 해당 필드를 액세스하여 메소드라고합니다.
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
예. 나는 번역에서 약간의 이름을 놓쳤다. 나는 이제 괜찮다고 생각한다. –