[ 
http://issues.apache.org/jira/browse/HADOOP-367?page=comments#action_12442183 ] 
            
Benjamin Reed commented on HADOOP-367:
--------------------------------------


   [[ Old comment, sent by email on Tue, 25 Jul 2006 10:30:37 -0700 ]]

When would you call setAccessable? It would have to be outside of the class 
since nothing is initialized.

One option would be to put a public static getFactory() method on the class. 
Not only would that cause the static blocks to be run, but it would allow you 
to get rid of the factory table and just use reflection to call getFactory() 
on the class if there is one otherwise fall back to newInstance().

ben



> 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

        

Reply via email to