/* Name of the class has to be "Main" only if the class is public. */
public class Main
{
public static class MyClass {
public MyClass( ) {
System .
out .
println ( "MyClass default constructor" ) ; }
}
public static class MySubClass extends MyClass {
public MySubClass( ) {
super ( ) ;
System .
out .
println ( "MySubClass default constructor" ) ; }
}
public static class Factory< T extends MyClass> {
public T create( ) {
final T t = new T( ) ;
return t;
}
public T create
( final Class
<? extends T
> clazz
) throws Exception { final T t = clazz.newInstance ( ) ;
return t;
}
}
final Factory< MySubClass> factory = new Factory< MySubClass> ( ) ;
final MySubClass msc = factory.create ( ) ;
// final MySubClass msc = factory.create(MySubClass.class);
System .
out .
println ( "Created instance: " + msc
) ; }
}
Ci8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpwdWJsaWMgY2xhc3MgTWFpbgp7CglwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2xhc3MgewoJCXB1YmxpYyBNeUNsYXNzKCkgewoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk15Q2xhc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOwoJCX0KCX0KCQoJcHVibGljIHN0YXRpYyBjbGFzcyBNeVN1YkNsYXNzIGV4dGVuZHMgTXlDbGFzcyB7CgkJcHVibGljIE15U3ViQ2xhc3MoKSB7CgkJCXN1cGVyKCk7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiTXlTdWJDbGFzcyBkZWZhdWx0IGNvbnN0cnVjdG9yIik7CgkJfQoJfQoJCglwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnk8VCBleHRlbmRzIE15Q2xhc3M+IHsKCQlwdWJsaWMgVCBjcmVhdGUoKSB7CgkJCWZpbmFsIFQgdCA9IG5ldyBUKCk7CgkJCXJldHVybiB0OwoJCX0KCQkKCQlwdWJsaWMgVCBjcmVhdGUoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFQ+IGNsYXp6KSB0aHJvd3MgRXhjZXB0aW9uIHsKCQkJZmluYWwgVCB0ID0gY2xhenoubmV3SW5zdGFuY2UoKTsKCQkJcmV0dXJuIHQ7CgkJfQoJfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlmaW5hbCBGYWN0b3J5PE15U3ViQ2xhc3M+IGZhY3RvcnkgPSBuZXcgRmFjdG9yeTxNeVN1YkNsYXNzPigpOwoJCQoJCWZpbmFsIE15U3ViQ2xhc3MgbXNjID0gZmFjdG9yeS5jcmVhdGUoKTsKCQkvLyBmaW5hbCBNeVN1YkNsYXNzIG1zYyA9IGZhY3RvcnkuY3JlYXRlKE15U3ViQ2xhc3MuY2xhc3MpOwoJCQoJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlZCBpbnN0YW5jZTogIiArIG1zYyk7Cgl9Cn0=