target.dump("bin/bcel/changeimpl/CarHolder.class");
} catch (Exception e) {
// TODO: handle exception
}
}
}
之后当你再次运行CarHolder时,它的结果就改变了。上面是静态修改的例子,如果是想要动态修改,那么就利用自己的ClassFileTransformer,把byte数组转化成可操纵的对象,然后与上面的流程一样,最后再返回byte数组给classloader
Java代码
public byte[] transform(ClassLoader loader, String className,
Class< > classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
try {
//由byte数组生成JavaClass对象
InputStream inStream = new ByteArrayInputStream(classfileBuffer);
JavaClass jc = new ClassParser(inStream, className).parse();
//这里与上面流程是一样
//再次转化成byte数组,然后给classloader
JavaClass final = ***;
return final.getBytes();
} catch (Exception e) {
// TODO: handle exception
}
return classfileBuffer;
}
这是一个简单例子,从它上面可以看到“神奇”的表现,就像以前看很多框架的神奇之处一样,到头来都是背后做了很多不为人知的事情。同时为了这个例子,也学习到了很多以前很少关注的知识,这才是最大的收获。
作者“每天一小步”