import java.lang.reflect.Constructor; public class Master { public Master() { System.out.println( "Master >> " + this.getClass().getName() ); } public interface IJob { IJob getJob(); } public class JobDecorator implements IJob { private IJob job; @Override public IJob getJob() { return job; } public JobDecorator( Master master ) { Class<? extends Master> master_class = master.getClass(); String job_class_name = master_class.getName() + "$Job"; try { Class<? extends IJob> job_class = (Class<? extends IJob>) Class.forName( job_class_name ); Constructor<? extends IJob> job_constructor = job_class.getConstructor( master_class ); this.job = job_constructor.newInstance( master ); } catch ( ClassNotFoundException e ) { // TODO: find Job in super class e.printStackTrace(); } catch ( Exception e ) { System.err.println( "Can not construct " + job_class_name + " object." ); e.printStackTrace(); } } } public class Job implements IJob { public Job() { System.out.println( "Master.Job >> " + getJob().getClass().getName() ); } @Override public IJob getJob() { return this; } } }