import java.util.Collection ;
import java.util.Map ;
import java.lang.reflect.* ;
class A {
public A[ ] as;
public Collection< String> cs;
public Map
< String , Integer
> msi
; protected int i;
}
class Inspector {
public static void inspect( Class<?> clazz) {
try {
System .
out .
println ( "Inspecting class " + clazz.
getSimpleName ( ) + ":" ) ; Field [ ] fields
= clazz.
getDeclaredFields ( ) ; describe( f) ;
}
e.printStackTrace ( ) ;
}
}
describeModifiers( f) ;
Type t = f.getGenericType ( ) ;
describeType( t) ;
System .
out .
println ( " " + f.
getName ( ) ) ; }
private static void describeModifiers
( Field f
) { int modifiers = f.getModifiers ( ) ;
}
System .
out .
print ( " private " ) ; }
System .
out .
print ( " protected " ) ; }
// add more if you like
}
private static void describeType( Type type) {
if ( type instanceof ParameterizedType) {
ParameterizedType pt = ( ParameterizedType) type;
Type[ ] args = pt.getActualTypeArguments ( ) ;
System .
out .
print ( pt.
getRawType ( ) ) ; boolean atBegin = true ;
for ( Type t : args) {
if ( atBegin) {
atBegin = false ;
} else {
}
describeType( t) ;
}
} else if ( type instanceof GenericArrayType) {
GenericArrayType arrType = ( GenericArrayType) type;
describeType( arrType.getGenericComponentType ( ) ) ;
} else if ( type instanceof Class ) {
Class<?> clazz = ( Class ) type;
System .
out .
print ( clazz.
getSimpleName ( ) ) ; }
// a lot of more interesing stuff can be done here
}
}
class Main {
public static void main
( String ...
args ) { Inspector.inspect ( A.class ) ;
}
}
aW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CgpjbGFzcyBBIHsKICAgIHB1YmxpYyBBW10gYXM7CiAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGNzOwogICAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IG1zaTsKICAgIHByaXZhdGUgU3RyaW5nIHM7CiAgICBwcm90ZWN0ZWQgaW50IGk7Cn0KCmNsYXNzIEluc3BlY3RvciB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zcGVjdChDbGFzczw/PiBjbGF6eikgewoJdHJ5IHsKCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3BlY3RpbmcgY2xhc3MgIiArIGNsYXp6LmdldFNpbXBsZU5hbWUoKSArICI6Iik7CgkgICAgRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwoJICAgIGZvciAoRmllbGQgZiA6IGZpZWxkcykgewoJCWRlc2NyaWJlKGYpOwoJICAgIH0KCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKCX0KICAgIH0KICAgIAogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZXNjcmliZShGaWVsZCBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKCWRlc2NyaWJlTW9kaWZpZXJzKGYpOwoJVHlwZSB0ID0gZi5nZXRHZW5lcmljVHlwZSgpOwoJZGVzY3JpYmVUeXBlKHQpOwoJU3lzdGVtLm91dC5wcmludGxuKCIgIiArIGYuZ2V0TmFtZSgpKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlc2NyaWJlTW9kaWZpZXJzKEZpZWxkIGYpIHsKCWludCBtb2RpZmllcnMgPSBmLmdldE1vZGlmaWVycygpOwoJaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIHsKCSAgICBTeXN0ZW0ub3V0LnByaW50KCIgcHVibGljICIpOwoJfQoJaWYgKE1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKSB7CgkgICAgU3lzdGVtLm91dC5wcmludCgiIHByaXZhdGUgIik7Cgl9CglpZiAoTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSkgewoJICAgIFN5c3RlbS5vdXQucHJpbnQoIiBwcm90ZWN0ZWQgIik7Cgl9CgkvLyBhZGQgbW9yZSBpZiB5b3UgbGlrZQogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVzY3JpYmVUeXBlKFR5cGUgdHlwZSkgewoJaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgewoJICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlOwoJICAgIFR5cGVbXSBhcmdzID0gcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOwoJICAgIFN5c3RlbS5vdXQucHJpbnQocHQuZ2V0UmF3VHlwZSgpKTsKCSAgICBTeXN0ZW0ub3V0LnByaW50KCI8Iik7CgkgICAgYm9vbGVhbiBhdEJlZ2luID0gdHJ1ZTsKCSAgICBmb3IgKFR5cGUgdCA6IGFyZ3MpIHsKCQlpZiAoYXRCZWdpbikgewoJCSAgICBhdEJlZ2luID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKCQl9CgkJZGVzY3JpYmVUeXBlKHQpOwoJICAgIH0KCSAgICBTeXN0ZW0ub3V0LnByaW50KCI+ICIpOwoJCgl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CgkgICAgR2VuZXJpY0FycmF5VHlwZSBhcnJUeXBlID0gKEdlbmVyaWNBcnJheVR5cGUpIHR5cGU7CgkgICAgZGVzY3JpYmVUeXBlKGFyclR5cGUuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7CgkgICAgU3lzdGVtLm91dC5wcmludGxuKCJbXSAiKTsKCX0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CgkgICAgQ2xhc3M8Pz4gY2xhenogPSAoQ2xhc3MpIHR5cGU7CgkgICAgU3lzdGVtLm91dC5wcmludChjbGF6ei5nZXRTaW1wbGVOYW1lKCkpOwoJfQoJLy8gYSBsb3Qgb2YgbW9yZSBpbnRlcmVzaW5nIHN0dWZmIGNhbiBiZSBkb25lIGhlcmUKICAgIH0KfQoKY2xhc3MgTWFpbiB7CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3MpIHsKCUluc3BlY3Rvci5pbnNwZWN0KEEuY2xhc3MpOwogICAgfQp9