import java.util.* ;
import java.lang.reflect.* ;
enum Color { RED, BLUE, GREEN
} ;
class Example {
// use the Field at least once so it creates and caches accessors
// with the final modifier
// now throws IllegalAccessException, because removing
// the final modifier has no effect (IllegalAccessException
// is thrown by the field accessor)
try {
System .
out .
println ( " at " + x.
getStackTrace ( ) [ 0 ] ) ; }
// clear accessors
clearFieldAccessors
( getValuesField
( Color .
class ) ) ; // now it works
}
Field f
= c.
getDeclaredField ( "$VALUES" ) ; f.setAccessible ( true ) ;
return f;
}
static < E
extends Enum
< E
>> void setEnumsArray
( Class
< E
> ec, E...
e ) throws Exception { Field field
= getValuesField
( ec
) ; Field modifiersField
= Field .
class .
getDeclaredField ( "modifiers" ) ; field.setAccessible ( true ) ;
modifiersField.setAccessible ( true ) ;
modifiersField.
setInt ( field, field.
getModifiers ( ) & ~
Modifier .
FINAL ) ; field.set ( ec, e) ;
}
static void clearFieldAccessors
( Field field
) throws ReflectiveOperationException {
Field fa
= Field .
class .
getDeclaredField ( "fieldAccessor" ) ; fa.setAccessible ( true ) ;
fa.set ( field, null ) ;
Field ofa
= Field .
class .
getDeclaredField ( "overrideFieldAccessor" ) ; ofa.setAccessible ( true ) ;
ofa.set ( field, null ) ;
rf.setAccessible ( true ) ;
if ( root != null ) {
clearFieldAccessors( root) ;
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKCmVudW0gQ29sb3Ige1JFRCwgQkxVRSwgR1JFRU59OwoKY2xhc3MgRXhhbXBsZSB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAvLyB1c2UgdGhlIEZpZWxkIGF0IGxlYXN0IG9uY2Ugc28gaXQgY3JlYXRlcyBhbmQgY2FjaGVzIGFjY2Vzc29ycwogICAgICAgIC8vIHdpdGggdGhlIGZpbmFsIG1vZGlmaWVyCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZygoT2JqZWN0W10pIGdldFZhbHVlc0ZpZWxkKENvbG9yLmNsYXNzKS5nZXQobnVsbCkpKTsKICAgICAgICAKICAgICAgICAvLyBub3cgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIGJlY2F1c2UgcmVtb3ZpbmcKICAgICAgICAvLyB0aGUgZmluYWwgbW9kaWZpZXIgaGFzIG5vIGVmZmVjdCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgogICAgICAgIC8vIGlzIHRocm93biBieSB0aGUgZmllbGQgYWNjZXNzb3IpCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc2V0RW51bXNBcnJheShDb2xvci5jbGFzcywgQ29sb3IuUkVELCBDb2xvci5SRUQsIENvbG9yLlJFRCk7CiAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB4KSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4KTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgYXQgIiArIHguZ2V0U3RhY2tUcmFjZSgpWzBdKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gY2xlYXIgYWNjZXNzb3JzCiAgICAgICAgY2xlYXJGaWVsZEFjY2Vzc29ycyhnZXRWYWx1ZXNGaWVsZChDb2xvci5jbGFzcykpOwogICAgICAgIC8vIG5vdyBpdCB3b3JrcwogICAgICAgIHNldEVudW1zQXJyYXkoQ29sb3IuY2xhc3MsIENvbG9yLlJFRCwgQ29sb3IuUkVELCBDb2xvci5SRUQpOwogICAgICAgIAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihBcnJheXMudG9TdHJpbmcoQ29sb3IudmFsdWVzKCkpKTsKICAgIH0KICAgIAogICAgc3RhdGljIEZpZWxkIGdldFZhbHVlc0ZpZWxkKENsYXNzPD8+IGMpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIEZpZWxkIGYgPSBjLmdldERlY2xhcmVkRmllbGQoIiRWQUxVRVMiKTsKICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICAKICAgIHN0YXRpYyA8RSBleHRlbmRzIEVudW08RT4+IHZvaWQgc2V0RW51bXNBcnJheShDbGFzczxFPiBlYywgRS4uLiBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBGaWVsZCBmaWVsZCA9IGdldFZhbHVlc0ZpZWxkKGVjKTsKICAgICAgICBGaWVsZCBtb2RpZmllcnNGaWVsZCA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOwogICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgbW9kaWZpZXJzRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICBtb2RpZmllcnNGaWVsZC5zZXRJbnQoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKICAgICAgICBmaWVsZC5zZXQoZWMsIGUpOwogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCBjbGVhckZpZWxkQWNjZXNzb3JzKEZpZWxkIGZpZWxkKQogICAgICAgICAgICB0aHJvd3MgUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgRmllbGQgZmEgPSBGaWVsZC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmaWVsZEFjY2Vzc29yIik7CiAgICAgICAgZmEuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICBmYS5zZXQoZmllbGQsIG51bGwpOwogICAgCiAgICAgICAgRmllbGQgb2ZhID0gRmllbGQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgib3ZlcnJpZGVGaWVsZEFjY2Vzc29yIik7CiAgICAgICAgb2ZhLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgb2ZhLnNldChmaWVsZCwgbnVsbCk7CiAgICAKICAgICAgICBGaWVsZCByZiA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoInJvb3QiKTsKICAgICAgICByZi5zZXRBY2Nlc3NpYmxlKHRydWUpOwogICAgICAgIEZpZWxkIHJvb3QgPSAoRmllbGQpIHJmLmdldChmaWVsZCk7CiAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCkgewogICAgICAgICAgICBjbGVhckZpZWxkQWNjZXNzb3JzKHJvb3QpOwogICAgICAgIH0KICAgIH0KfQ==