private void addCloningCode() {
if (_meta.getPCSuperclass() != null && !getCreateSubclass())
return;
// add the clone method if necessary
BCMethod clone = _pc.getDeclaredMethod("clone",
(String[]) null);
String superName = _managedType.getSuperclassName();
Code code = null;
if (clone == null) {
// add clone support for base classes
// which also implement cloneable
boolean isCloneable = Cloneable.class.isAssignableFrom(
_managedType.getType());
boolean extendsObject =
superName.equals(Object.class.getName());
if (!isCloneable || (!extendsObject && !getCreateSubclass()))
return;
if (!getCreateSubclass())
if (_log.isTraceEnabled())
_log.trace(
_loc.get("enhance-cloneable", _managedType.getName()));
// add clone method
// protected Object clone () throws CloneNotSupportedException
clone = _pc.declareMethod("clone", Object.class, null);
if (!setVisibilityToSuperMethod(clone))
clone.makeProtected();
clone.getExceptions(true).addException
(CloneNotSupportedException.class);
code = clone.getCode(true);
// return super.clone ();
loadManagedInstance(code, false);
code.invokespecial().setMethod(superName, "clone",
Object.class.getName(), null);
code.areturn();
} else {
// get the clone method code
code = clone.getCode(false);
if (code == null)
return;
}
// create template super.clone () instruction to match against