[ http://issues.apache.org/jira/browse/HADOOP-367?page=all ]
Owen O'Malley resolved HADOOP-367. ---------------------------------- Resolution: Duplicate This has been fixed across several patches by using the new ReflectionUtils.newInstance in all contexts. We currently require java 5.0, so clearly this bug isn't present anymore. > Static blocks do not automatically run when a class is loaded in Java 5.0 > ------------------------------------------------------------------------- > > Key: HADOOP-367 > URL: http://issues.apache.org/jira/browse/HADOOP-367 > Project: Hadoop > Issue Type: Bug > Components: dfs > Affects Versions: 0.4.0 > Environment: Java 5.0 > Reporter: Benjamin Reed > Attachments: f.patch, reflection.patch > > > There seems to be a change that happened between 1.4 and 1.5 with respect to > static initializers. I can't find this documented, but I can reproduce with a > very simple program. Basically, a static initializer is not called unless a > static member/method of the class is accessed or an instance is created. This > is actually what the JLS says, but until 1.5 the static initializers ran when > the class was loaded. Note that this behavior only occurs when running with > the 1.5 JRE AND compiling for 1.5. > For many Writables this isn't an issue, so the fallback behavior of the > WritableFactory works, but Block is package private, so loadEdits fails when > called from org.apache.hadoop.io.ArrayWritable.readFields() yielding the > following trace: > Caused by: java.lang.RuntimeException: java.lang.IllegalAccessException: > Class org.apache.hadoop.io.WritableFactories can not access a member of class > org.apache.hadoop.dfs.Block with modifiers "public" > at > org.apache.hadoop.io.WritableFactories.newInstance(WritableFactories.java:49) > at > org.apache.hadoop.io.ArrayWritable.readFields(ArrayWritable.java:81) > at org.apache.hadoop.dfs.FSDirectory.loadFSEdits(FSDirectory.java:532) > at org.apache.hadoop.dfs.FSDirectory.loadFSImage(FSDirectory.java:470) > at org.apache.hadoop.dfs.FSDirectory.<init>(FSDirectory.java:307) > at org.apache.hadoop.dfs.FSNamesystem.<init>(FSNamesystem.java:177) > at org.apache.hadoop.dfs.NameNode.<init>(NameNode.java:91) > at org.apache.hadoop.dfs.NameNode.<init>(NameNode.java:84) > at org.apache.hadoop.dfs.NameNode.main(NameNode.java:491) -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira