casting problem
bblfish May 2, 2006 11:41 AMI am having trouble casting the return value of a function call to the correct type of a field. FieldSetEditor.edit calls ClassRewriter.setField
which returns an Object. I would like the return value to be cast to the correct type. I tried defining setField with generics,
public <T> T setField(Clazz<T> ....) { ... return (T)object; }
but as generics are not supported, that does not help...
Also what would happen if someone entered a " in the string that
I pass in the field?
package com.sun.labs.rdf; import com.sun.labs.rdf.annotations.RDF; import javassist.*; import javassist.expr.ExprEditor; import javassist.expr.FieldAccess; /** * @author Henry Story */ public class ClassRewriter { public static String reverse(String value) { int length = value.length(); StringBuffer buff = new StringBuffer(length); for (int i = length - 1; i >= 0; i--) { buff.append(value.charAt(i)); } System.out.println("TranslateEditor.reverse returning " + buff); return buff.toString(); } public static Object setField(Object o,String url, Object value) { System.out.println("setting o="+o+" R="+url+" v="+value); return value; } public static void main(String[] args) { if (args.length != 0) { try { // set up class loader with translator EditorTranslator xtor = new EditorTranslator(new FieldSetEditor()); ClassPool pool = ClassPool.getDefault(); Loader loader = new Loader(); loader.addTranslator(pool, xtor); // invoke the "main" method of the application class loader.run(args); } catch (Throwable ex) { ex.printStackTrace(); } } else { System.out.println("Usage: ClassRewriter main-class args..."); } } } class EditorTranslator implements Translator { private ExprEditor m_editor; EditorTranslator(ExprEditor editor) { m_editor = editor; } public void start(ClassPool pool) { System.out.println("start pool"); } public void onLoad(ClassPool pool, String cname) throws NotFoundException, CannotCompileException { System.out.println("cname(in Onload)=" + cname); CtClass clas = pool.get(cname); clas.instrument(m_editor); } } class FieldSetEditor extends ExprEditor { FieldSetEditor() { } public void edit(FieldAccess arg) throws CannotCompileException { System.out.println("in edit- field=" + arg.getFieldName()); try { String field; if ((field=containsRDF(arg.getField().getAnnotations()))!=null) { if (arg.isWriter()) { StringBuffer code = new StringBuffer(); code.append("$0."); code.append(arg.getFieldName()); // code.append("=com.sun.labs.rdf.sommer.ClassRewriter.reverse($1);"); code.append("=($r)com.sun.labs.rdf.sommer.ClassRewriter.setField($0,\""+field+"\",$1);"); System.out.println("code="+code.toString()); arg.replace(code.toString()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); //todo: decide what exception to throw } catch (NotFoundException e) { e.printStackTrace(); //todo: decide what exception to throw } } private String containsRDF(Object[] annotations) { for (Object o: annotations) { if (o instanceof RDF) return ((RDF)o).value(); } return null; } }