Constant Value in Java Class Binary

Constant Value in Java Class Binary

To do unit test or regression, we create a delta sandbox from base level code, and then upload the java source modified to the build machine, and run ant to build it.
It would only compile the modified java sources and build a jar with other old class files.

Today I find an interesting and weird thing.

I change the constant value in one source class. During my unit test, I find that in other classes, which I don't change, and are not recompiled, it still uses old value of the constant. This is weird.

I am wondering this may be because java class byte-code hard-codes the constant value in the class file for efficiency or other reasons.

So I write a small program to verify it.

A class that defines the constant:
public class Constants
{
    public static final int CONSTANT = 12345678;
}
A class - ConstantsReader that uses the constant:
public class ConstantsReader
{
    public static int getConstant()
    {
       return Constants.CONSTANT;
    }
}
A class - Main that prints out the value of the constant seen in ConstantsReader class.
public class Main
{
    public static void main(String[] args)
    {
       System.err.println("Constants.CONSTAN: " + ConstantsReader.getConstant());
    }
}
The copy these classes to another folder, and run Main class, it prints out:
Constants.CONSTAN: 12345678

Later, I change the constant value to 87654321, and copy the modified class ConstantsReader to the folder. Run Main class, we can see that it still prints old value:
Constants.CONSTAN: 12345678
Then I use Beyond Compare to compare the old class file of ConstantsReader and with the new one in Eclipse in Hex Viewer.
We can see that the constant value Constants.CONSTANT is replaced with literal constant value, ‘12345678’ in old version, ‘87654321’ in new version.

Use ‘javap -verbose -c -private ConstantsReader’ to compre the old and new version of the binary class.
Old version:
const #22 = String      #23;    //  Constants.CONSTAN: 12345678
const #23 = Asciz       Constants.CONSTAN: 12345678;
const #30 = int 12345678;
public static int getConstant();
 Code:
  Stack=2, Locals=0, Args_size=0
  0:   getstatic       #16; //Field java/lang/System.err:Ljava/io/PrintStream;
  3:   ldc     #22; //String Constants.CONSTAN: 12345678
  5:   invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  8:   ldc     #30; //int 12345678
  10:  ireturn
 LineNumberTable:
  line 5: 0
  line 6: 8

New version:
const #22 = String      #23;    //  Constants.CONSTAN: 87654321
const #23 = Asciz       Constants.CONSTAN: 87654321;
public static int getConstant();
 Code:
  Stack=2, Locals=0, Args_size=0
  0:   getstatic       #16; //Field java/lang/System.err:Ljava/io/PrintStream;
  3:   ldc     #22; //String Constants.CONSTAN: 87654321
  5:   invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  8:   ldc     #30; //int 87654321
  10:  ireturn
 LineNumberTable:
  line 5: 0
  line 6: 8

So my guess is verified, and it’s fun to know this truth.
Post a Comment

Labels

Java (159) Lucene-Solr (110) All (60) Interview (59) J2SE (53) Algorithm (37) Eclipse (35) Soft Skills (35) Code Example (31) Linux (26) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (15) Defects (14) Text Mining (14) J2EE (13) Network (13) PowerShell (11) Chrome (9) Continuous Integration (9) How to (9) Learning code (9) Performance (9) UIMA (9) html (9) Design (8) Dynamic Languages (8) Http Client (8) Maven (8) Security (8) Trouble Shooting (8) bat (8) blogger (8) Big Data (7) Google (7) Guava (7) JSON (7) Problem Solving (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) IDE (5) Lesson Learned (5) Miscs (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) OpenNLP (4) Project Managment (4) Python (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Firefox (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Google Drive (2) Gson (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Bit Operation (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Troubleshooting (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts