2012-06-14 25 views
-2

我知道我们可以从.class文件加载一个对象,我的问题是如何做到相反。 我使用Class.forName("classname")来获得一个Class对象,我怎样才能把它写回.class文件? 序列化类不是这个问题的关键,因为加载的文件可能不是实现Serializable接口。如何将Class对象写回.class文件?

我问这个问题的原因是我需要将Class对象转换为java源文本字符串。如果有人知道如何直接将Object类转换为源代码,这可能会很有帮助。

+2

你是问有关反编译的东西吗?在采取.class文件,并获得.java“等效”? – Austin

+0

http://java.decompiler.free.fr/ –

+0

如果奥斯汀是正确的,那么你可以去许多免费的工具,可以将.cl​​ass文件转换成.java..ex DJ(DJ Java Decompiler).. – Rajesh

回答

1

如果你想添加功能等,你可以使用的类。

http://www.jboss.org/javassist

例如:

clazz = fullclass name, method = "public void doxxx(){ int x =0;x++}" 

private static void createMethod(String clazz,String method){ 
     ClassPool pool = ClassPool.getDefault(); 
     try { 
      Class<?> class1 = Class.forName(clazz); 
      class1.getProtectionDomain().getCodeSource().getLocation(); 
      pool.insertClassPath(new ClassClassPath(class1)); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     CtClass pt; 
     try { 

      pt = pool.get(clazz); 



      CtMethod m = CtNewMethod.make(method, pt); 
      pt.addMethod(m); 
      pt.writeFile(); 
      pt.toClass(); 

     } catch (NotFoundException e) { 
      e.printStackTrace(); 
     } catch (CannotCompileException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

我正在阅读Javassist的doc,快速检查:我可以使用此工具在运行时读取类对象并修改某些属性值并在运行时回写到JVM? – JerryCai

+0

我不确定您是否可以像正常的.java代码那样读取.class文件中的当前内容。但是如果你喜欢,你可以覆盖一个方法,但是你有什么办法可以先将oldone重命名为diffrent。 – Trind