import java.lang.reflect.Method ;
import java.util.Arrays ;
import java.util.List ;
import java.util.stream.Collectors ;
public class Main
{
public static void main
( String [ ] args
) {
Condition c = new Condition( ) ;
List
< Class
<? extends Base
>> classList
= Arrays .
asList ( ClassFoo.
class , ClassBaa.
class ) ;
List< Base> result = classList.stream ( )
.map ( e -> newInstanceWithCondition( e, c) )
.collect ( Collectors.toList ( ) ) ;
result.
forEach ( System .
out :: println
) ; }
static Base newInstanceWithCondition( Class<? extends Base> clazz, Condition c)
{
try
{
Method method
= clazz.
getMethod ( "newInstanceWithCondition" , Condition.
class ) ; return ( Base) method.invoke ( null , c) ;
{
}
}
}
class Base
{
@Override
{
return String .
format ( "%sのインスタンスです。" , getClass
( ) ) ; }
}
interface BaseIF{ }
class Condition{ }
class ClassFoo extends Base implements BaseIF
{
public static ClassFoo newInstanceWithCondition( Condition c)
{
System .
out .
println ( "ClassFoo#newInstanceWithCondition(Condition c)が呼ばれました" ) ; return new ClassFoo( ) ;
}
}
class ClassBaa extends Base implements BaseIF
{
public static ClassBaa newInstanceWithCondition( Condition c)
{
System .
out .
println ( "ClassBaa#newInstanceWithCondition(Condition c)が呼ばれました" ) ; return new ClassBaa( ) ;
}
}
aW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKCgpwdWJsaWMgY2xhc3MgTWFpbgp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIENvbmRpdGlvbiBjID0gbmV3IENvbmRpdGlvbigpOwogICAgICAgIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEJhc2U+PiBjbGFzc0xpc3QgPSBBcnJheXMuYXNMaXN0KENsYXNzRm9vLmNsYXNzLCBDbGFzc0JhYS5jbGFzcyk7CgogICAgICAgIExpc3Q8QmFzZT4gcmVzdWx0ID0gY2xhc3NMaXN0LnN0cmVhbSgpCiAgICAgICAgICAgICAgICAubWFwKGUgLT4gbmV3SW5zdGFuY2VXaXRoQ29uZGl0aW9uKGUsIGMpKQogICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CgogICAgICAgIHJlc3VsdC5mb3JFYWNoKFN5c3RlbS5vdXQ6OnByaW50bG4pOwogICAgfQoKCiAgICBzdGF0aWMgQmFzZSBuZXdJbnN0YW5jZVdpdGhDb25kaXRpb24oQ2xhc3M8PyBleHRlbmRzIEJhc2U+IGNsYXp6LCBDb25kaXRpb24gYykKICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoIm5ld0luc3RhbmNlV2l0aENvbmRpdGlvbiIsIENvbmRpdGlvbi5jbGFzcyk7CiAgICAgICAgICAgIHJldHVybiAoQmFzZSkgbWV0aG9kLmludm9rZShudWxsLCBjKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgQmFzZQp7CiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlc+OBruOCpOODs+OCueOCv+ODs+OCueOBp+OBmeOAgiIsIGdldENsYXNzKCkpOwogICAgfQp9CgoKaW50ZXJmYWNlIEJhc2VJRnt9CgoKY2xhc3MgQ29uZGl0aW9ue30KCgpjbGFzcyBDbGFzc0ZvbyBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBCYXNlSUYKewogICAgcHVibGljIHN0YXRpYyBDbGFzc0ZvbyBuZXdJbnN0YW5jZVdpdGhDb25kaXRpb24oQ29uZGl0aW9uIGMpCiAgICB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGFzc0ZvbyNuZXdJbnN0YW5jZVdpdGhDb25kaXRpb24oQ29uZGl0aW9uIGMp44GM5ZG844Gw44KM44G+44GX44GfIik7CiAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0ZvbygpOwogICAgfQp9CgoKY2xhc3MgQ2xhc3NCYWEgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgQmFzZUlGCnsKICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NCYWEgbmV3SW5zdGFuY2VXaXRoQ29uZGl0aW9uKENvbmRpdGlvbiBjKQogICAgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3NCYWEjbmV3SW5zdGFuY2VXaXRoQ29uZGl0aW9uKENvbmRpdGlvbiBjKeOBjOWRvOOBsOOCjOOBvuOBl+OBnyIpOwogICAgICAgIHJldHVybiBuZXcgQ2xhc3NCYWEoKTsKICAgIH0KfQ==