www.pluralsight.com
Open in
urlscan Pro
2606:4700::6811:2355
Public Scan
Submitted URL: https://connect.pluralsight.com/dc/l6WRhHKnwa3LcpUsJiJZ-KNupKrVAFT9E5p1RhihJqUqAQKNwkZCGHNAWM61_nivy5tVhsjnPPwZ7aRo7XapaefElKab8...
Effective URL: https://www.pluralsight.com/resources/blog/software-development/how-read-java-bytecode?utm_source=marketo&utm_medium=email&u...
Submission Tags: urlscan
Submission: On March 20 via api from US — Scanned from DE
Effective URL: https://www.pluralsight.com/resources/blog/software-development/how-read-java-bytecode?utm_source=marketo&utm_medium=email&u...
Submission Tags: urlscan
Submission: On March 20 via api from US — Scanned from DE
Form analysis
4 forms found in the DOM<form class="header-search-form">
<input class="header-search-input" type="text" name="q" placeholder="What do you want to learn?" autocomplete="off">
</form>
<form class="header-search-form -flex-and-center">
<input class="header-search-input flex-1" type="text" name="q" placeholder="Search" autocomplete="off">
<button type="submit">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" role="button">
<title>A search magnifying glass</title>
<mask id="mask0_3541_6692" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="2" y="2" width="20" height="20">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M21.3534 19.9404L21.3535 19.9404L16.314 14.9C17.403 13.504 18 11.799 18 10C18 7.863 17.167 5.856 15.656 4.344C14.145 2.832 12.137 2 10 2C7.863 2 5.854 2.832 4.344 4.344C2.832 5.856 2 7.863 2 10C2 12.137 2.832 14.146 4.344 15.656C5.854 17.168 7.863 18 10 18C11.799 18 13.504 17.404 14.9 16.315L19.9394 21.3544C20.1347 21.5497 20.4513 21.5497 20.6466 21.3544L21.3534 20.6476L21.3534 20.6475C21.5487 20.4523 21.5487 20.1357 21.3534 19.9404ZM14.242 14.243C13.109 15.376 11.602 16 10 16C8.397 16 6.891 15.376 5.758 14.243C4.624 13.11 4 11.603 4 10C4 8.398 4.624 6.891 5.758 5.758C6.891 4.624 8.397 4 10 4C11.602 4 13.109 4.624 14.242 5.758C15.376 6.891 16 8.398 16 10C16 11.603 15.376 13.11 14.242 14.243Z"
fill="white"></path>
</mask>
<g mask="url(#mask0_3541_6692)">
<rect width="24" height="24" fill="#A5AACF"></rect>
</g>
</svg>
</button>
</form>
<form id="customMarketo_1298" data-mkto-id="1298">
<div class="marketo-form-field">
<label for="FirstName" class="mrkto_text_lbl">First Name<span class="requiredAsterix">*</span></label>
<input type="text" id="1298_FirstName" class="mrkto_text" name="FirstName" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<label for="LastName" class="mrkto_text_lbl">Last Name<span class="requiredAsterix">*</span></label>
<input type="text" id="1298_LastName" class="mrkto_text" name="LastName" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<label for="Email" class="mrkto_text_lbl">Email Address<span class="requiredAsterix">*</span></label>
<input type="email" id="1298_Email" class="mrkto_email" name="Email" required="" oninvalid="setCustomValidity('Must be valid email. example@yourdomain.com)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<label for="Company" class="mrkto_text_lbl">Company<span class="requiredAsterix">*</span></label>
<input type="text" id="1298_Company" class="mrkto_text" name="Company" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<label for="Title" class="mrkto_text_lbl">Job Title<span class="requiredAsterix">*</span></label>
<input type="text" id="1298_Title" class="mrkto_text" name="Title" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<label for="Phone" class="mrkto_text_lbl">Phone<span class="requiredAsterix">*</span></label>
<input type="text" id="1298_Phone" class="mrkto_text" name="Phone" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<label for="Country" class="mrkto_select_lbl">Country<span class="requiredAsterix">*</span></label>
<select id="1298_Country" class="mrkto_select" name="Country" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')">
<option value="">Select...</option>
<option value="United States">United States</option>
<option value="Afghanistan">Afghanistan</option>
<option value="Aland Islands">Aland Islands</option>
<option value="Albania">Albania</option>
<option value="Algeria">Algeria</option>
<option value="American Samoa">American Samoa</option>
<option value="Andorra">Andorra</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Antarctica">Antarctica</option>
<option value="Antigua and Barbuda">Antigua and Barbuda</option>
<option value="Argentina">Argentina</option>
<option value="Armenia">Armenia</option>
<option value="Aruba">Aruba</option>
<option value="Australia">Australia</option>
<option value="Austria">Austria</option>
<option value="Azerbaijan">Azerbaijan</option>
<option value="Bahamas">Bahamas</option>
<option value="Bahrain">Bahrain</option>
<option value="Bangladesh">Bangladesh</option>
<option value="Barbados">Barbados</option>
<option value="Belarus">Belarus</option>
<option value="Belgium">Belgium</option>
<option value="Belize">Belize</option>
<option value="Benin">Benin</option>
<option value="Bermuda">Bermuda</option>
<option value="Bhutan">Bhutan</option>
<option value="Bolivia">Bolivia</option>
<option value="Bonaire, Saint Eustatius and Saba">Bonaire, Saint Eustatius and Saba</option>
<option value="Bosnia and Herzegovina">Bosnia and Herzegovina</option>
<option value="Botswana">Botswana</option>
<option value="Bouvet Island">Bouvet Island</option>
<option value="Brazil">Brazil</option>
<option value="British Indian Ocean Territory">British Indian Ocean Territory</option>
<option value="Brunei Darussalam">Brunei Darussalam</option>
<option value="Bulgaria">Bulgaria</option>
<option value="Burkina Faso">Burkina Faso</option>
<option value="Burundi">Burundi</option>
<option value="Cambodia">Cambodia</option>
<option value="Cameroon">Cameroon</option>
<option value="Canada">Canada</option>
<option value="Cape Verde">Cape Verde</option>
<option value="Cayman Islands">Cayman Islands</option>
<option value="Central African Republic">Central African Republic</option>
<option value="Chad">Chad</option>
<option value="Chile">Chile</option>
<option value="China">China</option>
<option value="Christmas Island">Christmas Island</option>
<option value="Cocos (Keeling) Islands">Cocos (Keeling) Islands</option>
<option value="Colombia">Colombia</option>
<option value="Comoros">Comoros</option>
<option value="Congo">Congo</option>
<option value="Congo the Democratic Republic of the">Democratic Republic of the Congo</option>
<option value="Cook Islands">Cook Islands</option>
<option value="Costa Rica">Costa Rica</option>
<option value="Cote d'Ivoire">Cote d'Ivoire</option>
<option value="Croatia">Croatia</option>
<option value="Cuba">Cuba</option>
<option value="Curacao">Curacao</option>
<option value="Cyprus">Cyprus</option>
<option value="Czech Republic">Czech Republic</option>
<option value="Denmark">Denmark</option>
<option value="Djibouti">Djibouti</option>
<option value="Dominica">Dominica</option>
<option value="Dominican Republic">Dominican Republic</option>
<option value="Ecuador">Ecuador</option>
<option value="Egypt">Egypt</option>
<option value="El Salvador">El Salvador</option>
<option value="Equatorial Guinea">Equatorial Guinea</option>
<option value="Eritrea">Eritrea</option>
<option value="Estonia">Estonia</option>
<option value="Ethiopia">Ethiopia</option>
<option value="Falkland Islands (Malvinas)">Falkland Islands (Malvinas)</option>
<option value="Faroe Islands">Faroe Islands</option>
<option value="Fiji">Fiji</option>
<option value="Finland">Finland</option>
<option value="France">France</option>
<option value="French Guiana">French Guiana</option>
<option value="French Polynesia">French Polynesia</option>
<option value="French Southern Territories">French Southern Territories</option>
<option value="Gabon">Gabon</option>
<option value="Gambia">Gambia</option>
<option value="Georgia">Georgia</option>
<option value="Germany">Germany</option>
<option value="Ghana">Ghana</option>
<option value="Gibraltar">Gibraltar</option>
<option value="Greece">Greece</option>
<option value="Greenland">Greenland</option>
<option value="Grenada">Grenada</option>
<option value="Guadeloupe">Guadeloupe</option>
<option value="Guam">Guam</option>
<option value="Guatemala">Guatemala</option>
<option value="Guernsey">Guernsey</option>
<option value="Guinea">Guinea</option>
<option value="Guinea-Bissau">Guinea-Bissau</option>
<option value="Guyana">Guyana</option>
<option value="Haiti">Haiti</option>
<option value="Heard Island and McDonald Islands">Heard Island and McDonald Islands</option>
<option value="Holy See (Vatican City State)">Holy See (Vatican City State)</option>
<option value="Honduras">Honduras</option>
<option value="Hong Kong">Hong Kong</option>
<option value="Hungary">Hungary</option>
<option value="Iceland">Iceland</option>
<option value="India">India</option>
<option value="Indonesia">Indonesia</option>
<option value="Iran">Iran</option>
<option value="Iraq">Iraq</option>
<option value="Ireland">Ireland</option>
<option value="Isle of Man">Isle of Man</option>
<option value="Israel">Israel</option>
<option value="Italy">Italy</option>
<option value="Jamaica">Jamaica</option>
<option value="Japan">Japan</option>
<option value="Jersey">Jersey</option>
<option value="Jordan">Jordan</option>
<option value="Kazakhstan">Kazakhstan</option>
<option value="Kenya">Kenya</option>
<option value="Kiribati">Kiribati</option>
<option value="Korea, Republic of">Korea</option>
<option value="Kosovo">Kosovo</option>
<option value="Kuwait">Kuwait</option>
<option value="Kyrgyzstan">Kyrgyzstan</option>
<option value="Lao People's Democratic Republic">Lao People's Democratic Republic</option>
<option value="Latvia">Latvia</option>
<option value="Lebanon">Lebanon</option>
<option value="Lesotho">Lesotho</option>
<option value="Liberia">Liberia</option>
<option value="Libyan Arab Jamahiriya">Libyan Arab Jamahiriya</option>
<option value="Liechtenstein">Liechtenstein</option>
<option value="Lithuania">Lithuania</option>
<option value="Luxembourg">Luxembourg</option>
<option value="Macao">Macao</option>
<option value="Macedonia, the Former Yugoslav Republic of">Republic of Macedonia</option>
<option value="Madagascar">Madagascar</option>
<option value="Malawi">Malawi</option>
<option value="Malaysia">Malaysia</option>
<option value="Maldives">Maldives</option>
<option value="Mali">Mali</option>
<option value="Malta">Malta</option>
<option value="Marshall Islands">Marshall Islands</option>
<option value="Martinique">Martinique</option>
<option value="Mauritania">Mauritania</option>
<option value="Mauritius">Mauritius</option>
<option value="Mayotte">Mayotte</option>
<option value="Mexico">Mexico</option>
<option value="Micronesia, Federated States of">Federated States of Micronesia</option>
<option value="Moldova, Republic of">Republic of Moldova</option>
<option value="Monaco">Monaco</option>
<option value="Mongolia">Mongolia</option>
<option value="Montenegro">Montenegro</option>
<option value="Montserrat">Montserrat</option>
<option value="Morocco">Morocco</option>
<option value="Mozambique">Mozambique</option>
<option value="Myanmar">Myanmar</option>
<option value="Namibia">Namibia</option>
<option value="Nauru">Nauru</option>
<option value="Nepal">Nepal</option>
<option value="Netherlands">Netherlands</option>
<option value="Netherlands Antilles">Netherlands Antilles</option>
<option value="New Caledonia">New Caledonia</option>
<option value="New Zealand">New Zealand</option>
<option value="Nicaragua">Nicaragua</option>
<option value="Niger">Niger</option>
<option value="Nigeria">Nigeria</option>
<option value="Niue">Niue</option>
<option value="Norfolk Island">Norfolk Island</option>
<option value="Northern Mariana Islands">Northern Mariana Islands</option>
<option value="Norway">Norway</option>
<option value="Oman">Oman</option>
<option value="Pakistan">Pakistan</option>
<option value="Palau">Palau</option>
<option value="Palestinian Territory, Occupied">Palestinian Territory</option>
<option value="Panama">Panama</option>
<option value="Papua New Guinea">Papua New Guinea</option>
<option value="Paraguay">Paraguay</option>
<option value="Peru">Peru</option>
<option value="Philippines">Philippines</option>
<option value="Pitcairn">Pitcairn</option>
<option value="Poland">Poland</option>
<option value="Portugal">Portugal</option>
<option value="Puerto Rico">Puerto Rico</option>
<option value="Qatar">Qatar</option>
<option value="Reunion">Reunion</option>
<option value="Romania">Romania</option>
<option value="Russian Federation">Russian Federation</option>
<option value="Rwanda">Rwanda</option>
<option value="Saint Barthelemy">Saint Barthelemy</option>
<option value="Saint Helena">Saint Helena</option>
<option value="Saint Kitts and Nevis">Saint Kitts and Nevis</option>
<option value="Saint Lucia">Saint Lucia</option>
<option value="Saint Martin (French part)">Saint Martin</option>
<option value="Saint Pierre and Miquelon">Saint Pierre and Miquelon</option>
<option value="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</option>
<option value="Samoa">Samoa</option>
<option value="San Marino">San Marino</option>
<option value="Sao Tome and Principe">Sao Tome and Principe</option>
<option value="Saudi Arabia">Saudi Arabia</option>
<option value="Senegal">Senegal</option>
<option value="Serbia">Serbia</option>
<option value="Seychelles">Seychelles</option>
<option value="Sierra Leone">Sierra Leone</option>
<option value="Singapore">Singapore</option>
<option value="Sint Maarten">Sint Maarten</option>
<option value="Slovakia">Slovakia</option>
<option value="Slovenia">Slovenia</option>
<option value="Solomon Islands">Solomon Islands</option>
<option value="Somalia">Somalia</option>
<option value="South Africa">South Africa</option>
<option value="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</option>
<option value="South Sudan">South Sudan</option>
<option value="Spain">Spain</option>
<option value="Sri Lanka">Sri Lanka</option>
<option value="Sudan">Sudan</option>
<option value="Suriname">Suriname</option>
<option value="Svalbard and Jan Mayen">Svalbard and Jan Mayen</option>
<option value="Swaziland">Swaziland</option>
<option value="Sweden">Sweden</option>
<option value="Switzerland">Switzerland</option>
<option value="Syria">Syria</option>
<option value="Taiwan">Taiwan</option>
<option value="Tajikistan">Tajikistan</option>
<option value="Tanzania, United Republic of">United Republic of Tanzania</option>
<option value="Thailand">Thailand</option>
<option value="Timor-Leste">Timor-Leste</option>
<option value="Togo">Togo</option>
<option value="Tokelau">Tokelau</option>
<option value="Tonga">Tonga</option>
<option value="Trinidad and Tobago">Trinidad and Tobago</option>
<option value="Tunisia">Tunisia</option>
<option value="Turkey">Turkey</option>
<option value="Turkmenistan">Turkmenistan</option>
<option value="Turks and Caicos Islands">Turks and Caicos Islands</option>
<option value="Tuvalu">Tuvalu</option>
<option value="Uganda">Uganda</option>
<option value="Ukraine">Ukraine</option>
<option value="United Arab Emirates">United Arab Emirates</option>
<option value="United Kingdom">United Kingdom</option>
<option value="United States Minor Outlying Islands">United States Minor Outlying Islands</option>
<option value="Uruguay">Uruguay</option>
<option value="Uzbekistan">Uzbekistan</option>
<option value="Vanuatu">Vanuatu</option>
<option value="Venezuela">Venezuela</option>
<option value="Viet Nam">Viet Nam</option>
<option value="Virgin Islands, British">Virgin Islands, British</option>
<option value="Virgin Islands, U.S.">Virgin Islands, U.S.</option>
<option value="Wallis and Futuna">Wallis and Futuna</option>
<option value="Yemen">Yemen</option>
<option value="Zambia">Zambia</option>
<option value="Zimbabwe">Zimbabwe</option>
</select>
</div>
<div class="marketo-form-field">
<label for="License_Count__c" class="mrkto_select_lbl">How many licenses will you need?<span class="requiredAsterix">*</span></label>
<select id="1298_License_Count__c" class="mrkto_select" name="License_Count__c" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')">
<option value="">Select...</option>
<option value="1">1 User</option>
<option value="2">2 to 10</option>
<option value="11">11 to 20</option>
<option value="21">21 to 50</option>
<option value="51">51+</option>
</select>
</div>
<div class="marketo-form-field">
<span>By filling out this form and clicking submit, you acknowledge our<span> </span></span><a href="https://www.pluralsight.com/privacy" target="_blank">privacy policy</a><span>.</span>
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_UTM_Source__c" class="mrkto_hidden" name="UTM_Source__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_UTM_Medium__c" class="mrkto_hidden" name="UTM_Medium__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_UTM_Campaign__c" class="mrkto_hidden" name="UTM_Campaign__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_UTM_Content__c" class="mrkto_hidden" name="UTM_Content__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_UTM_Term__c" class="mrkto_hidden" name="UTM_Term__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_mcvisid__c" class="mrkto_hidden" name="mcvisid__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_GCLID__c" class="mrkto_hidden" name="GCLID__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1298_Electronic_Person__c" class="mrkto_hidden" name="Electronic_Person__c">
</div>
<div class="marketo-form-field">
<button type="submit" class="mrkto_submit">Submit</button>
<input type="hidden" name="formid" value="1298">
</div>
</form>
<form id="customMarketo_1041" data-mkto-id="1041">
<div class="marketo-form-field">
<label for="Email" class="mrkto_text_lbl">Email Address:<span class="requiredAsterix">*</span></label>
<input type="email" id="1041_Email" class="mrkto_email" name="Email" required="" oninvalid="setCustomValidity('Must be valid email. example@yourdomain.com)" oninput="setCustomValidity('')" maxlength="255">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_UTM_Source__c" class="mrkto_hidden" name="UTM_Source__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_UTM_Medium__c" class="mrkto_hidden" name="UTM_Medium__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_UTM_Campaign__c" class="mrkto_hidden" name="UTM_Campaign__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_UTM_Content__c" class="mrkto_hidden" name="UTM_Content__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_UTM_Term__c" class="mrkto_hidden" name="UTM_Term__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_mcvisid__c" class="mrkto_hidden" name="mcvisid__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_GCLID__c" class="mrkto_hidden" name="GCLID__c">
</div>
<div class="marketo-form-field">
<input type="hidden" id="1041_Electronic_Person__c" class="mrkto_hidden" name="Electronic_Person__c">
</div>
<div class="marketo-form-field">
<input type="checkbox" id="1041_Single_Opt_In__c" class="mrkto_checkbox" name="Single_Opt_In__c" value="yes">
<label for="1041_Single_Opt_In__c" class="mrkto_checkbox_lbl">I would like to receive emails from Pluralsight</label>
</div>
<div class="marketo-form-field">
<button type="submit" class="mrkto_submit">Submit</button>
<input type="hidden" name="formid" value="1041">
</div>
</form>
Text Content
Skip to content * Pluralsight * Skills * A Cloud Guru * Flow * Blog An avatar icon Sign in * A skills logo Sign in to Skills The Skills product logo icon * A Cloud Guru small logo icon Sign in to A Cloud Guru A Cloud Guru logo, color version * Flow product logo Sign in to Flow The Flow product logo icon The Pluralsight logo, color version * Explore * Software dev * Cloud * IT Ops * Data * Security * Leadership * A search magnifying glass icon A search magnifying glass icon * Contact sales * View plans Close Icon Sign in Menu * * A skills logo Sign in to Skills The Skills product logo icon * A Cloud Guru small logo icon Sign in to A Cloud Guru A Cloud Guru logo, color version * Flow product logo Sign in to Flow The Flow product logo icon * * Pluralsight * Skills * A Cloud Guru * Flow * Blog A search magnifying glass * Explore * Software dev * Cloud * IT Ops * Data * Security * Leadership * Contact sales * View plans CONTACT SALES First Name* Last Name* Email Address* Company* Job Title* Phone* Country* Select... United States Afghanistan Aland Islands Albania Algeria American Samoa Andorra Angola Anguilla Antarctica Antigua and Barbuda Argentina Armenia Aruba Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Saint Eustatius and Saba Bosnia and Herzegovina Botswana Bouvet Island Brazil British Indian Ocean Territory Brunei Darussalam Bulgaria Burkina Faso Burundi Cambodia Cameroon Canada Cape Verde Cayman Islands Central African Republic Chad Chile China Christmas Island Cocos (Keeling) Islands Colombia Comoros Congo Democratic Republic of the Congo Cook Islands Costa Rica Cote d'Ivoire Croatia Cuba Curacao Cyprus Czech Republic Denmark Djibouti Dominica Dominican Republic Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Falkland Islands (Malvinas) Faroe Islands Fiji Finland France French Guiana French Polynesia French Southern Territories Gabon Gambia Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Heard Island and McDonald Islands Holy See (Vatican City State) Honduras Hong Kong Hungary Iceland India Indonesia Iran Iraq Ireland Isle of Man Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Korea Kosovo Kuwait Kyrgyzstan Lao People's Democratic Republic Latvia Lebanon Lesotho Liberia Libyan Arab Jamahiriya Liechtenstein Lithuania Luxembourg Macao Republic of Macedonia Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Federated States of Micronesia Republic of Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Myanmar Namibia Nauru Nepal Netherlands Netherlands Antilles New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island Northern Mariana Islands Norway Oman Pakistan Palau Palestinian Territory Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Poland Portugal Puerto Rico Qatar Reunion Romania Russian Federation Rwanda Saint Barthelemy Saint Helena Saint Kitts and Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia and the South Sandwich Islands South Sudan Spain Sri Lanka Sudan Suriname Svalbard and Jan Mayen Swaziland Sweden Switzerland Syria Taiwan Tajikistan United Republic of Tanzania Thailand Timor-Leste Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu Uganda Ukraine United Arab Emirates United Kingdom United States Minor Outlying Islands Uruguay Uzbekistan Vanuatu Venezuela Viet Nam Virgin Islands, British Virgin Islands, U.S. Wallis and Futuna Yemen Zambia Zimbabwe How many licenses will you need?* Select... 1 User 2 to 10 11 to 20 21 to 50 51+ By filling out this form and clicking submit, you acknowledge our privacy policy. Submit Thank you! Close button icon 1. Blog 2. Blog HOW TO READ JAVA BYTECODE FOR FUN AND PROFIT We cover what Java Bytecode is, why it exists, and how to read it. This can help you with optimizing performance, enhancing security, and reverse engineering. By Josh Cummings Jan 31, 2024 • 6 Minute Read * Software Development * Data * java -------------------------------------------------------------------------------- Subscribe to the newsletter Embarking on a journey through the world of Java Bytecode? This article covers everything you need to know to get started. WHAT IS BYTECODE? Back in 1995, Sun Microsystems, the creators of the Java programming language, made a bold claim. They said that Java would allow you to “write once and run anywhere.” That meant that the compiled binaries would be able to run on any system architecture, something that C could not do and remains a core tenant of writing Java to this day. To achieve this cross-platform capability, Java employs a unique approach when compiling. Instead of going from source code directly into machine code (which would be specific to each system architecture), Java compiles its programs into an intermediate form known as bytecode. Bytecode is a set of instructions that is neither tied to a particular machine language nor dependent on any specific hardware architecture. This abstraction is the key to Java's portability. The program that interprets and executes Java bytecode instructions is called a Java Virtual Machine (JVM). The JVM translates each bytecode instruction into the machine code native to the particular system architecture it is running on. This process, often referred to as "just-in-time" (JIT) compilation, allows Java bytecode to be executed as efficiently as possible on any given platform. VIEWING BYTECODE Bytecode isn’t just useful for the JVM, though. Because the bytecode of a Java class is helpful for reverse engineering, performance optimization, security research, and other static analysis functions, the JDK ships with utilities to help you and me inspect it. To glimpse at an example of bytecode, consider the following two methods from `java.lang.Boolean`, `booleanValue` and `valueOf(boolean)` which respectively unbox and box the `boolean` primitive type: java public boolean booleanValue() { return value; } public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } Using the `javap` command, which ships with the JDK, we can see the bytecode for each. You can do this by running `javap` with the `-c` command and the fully-qualified name of the class, like so: bash javap -c java.lang.Boolean There result is the bytecode for all the public methods in `java.lang.Boolean`. Here I’ve copied just the bytecode for `booleanValue` and `valueOf(boolean)`: java public boolean booleanValue(); Code: 0: aload_0 1: getfield #7 // Field value:Z 4: ireturn public static java.lang.Boolean valueOf(boolean); Code: 0: iload_0 1: ifeq 10 4: getstatic #27 // Field TRUE:Ljava/lang/Boolean; 7: goto 13 10: getstatic #31 // Field FALSE:Ljava/lang/Boolean; 13: areturn DISSECTING BYTECODE At first glance, it’s an entirely new language to learn. However, it quickly becomes straightforward when as you learn what each instruction does and that Java operates with a stack. Take the three bytecode instructions for `booleanValue`, for example: * `aload_n` means to place a reference to a local variable onto the stack. In a class instance, `aload_0` refers to `this`. * `getfield` means to read the member variable from `this` (the lower item on the stack) and place that value onto the stack * `#7` refers to the reference’s index in the constant pool * `// Field value:Z` tells us what `#7` refers to, a field named `value` of type `boolean` (Z) * `ireturn` means to pop a primitive value off of the stack and return it Long story short, these three instructions lookup the instance’s `value` field and return it. As a second example, take a look at the next method, `valueOf(boolean)`: * `iload_n` means to place a primitive local variable onto the stack. `iload_0` refers to the first method parameter (since the first method parameter is a primitive) * `ifeq n` means pop the value off of the stack and see if it is true; if so, proceed to the next line, otherwise jump to line `n` * `getstatic #n` means read a static member onto the stack * `#27` refers to the static member’s index in the constant pool * `// Field TRUE:Ljava/lang/Boolean` tells us what `#27` refers to, a static member named `TRUE` of type `Boolean * `goto n` means now jump to line `n` in the bytecode * `areturn` means pop a reference off of the stack and return it In other words, these instructions say, take the first method parameter, if it’s true, then return `Boolean.TRUE`; otherwise, return `Boolean.FALSE`. LEVERAGING BYTECODE ANALYSIS I mentioned earlier that this can be helpful for reverse engineering, performance optimization, and security research. Let’s expand on those now. REVERSE ENGINEERING When working with third-party libraries or closed-source components, bytecode analysis becomes a powerful tool. Decompiling bytecode can provide a glimpse into the inner workings of these libraries, aiding in integration, troubleshooting, and ensuring compatibility. In situations where you encounter proprietary or closed-source Java code, reading bytecode can be the only feasible way to understand its functionality. Bytecode analysis allows you to reverse engineer and comprehend the behavior of closed-source applications, facilitating interoperability or customization. In the way of a real-life example, I was recently trying to integrate a third-party package tangle analysis tool into our Ci system. Unfortunately, the vendor was closed-sourced and only had documentation for how to access the library through their proprietary UI. By analyzing the bytecode, I was able to reverse engineer the expected inputs and outputs of the underlying analytics engine. PERFORMANCE OPTIMIZATION With bytecode insight, you can make informed decisions about optimizing specific code segments. For instance, if the bytecode reveals redundant operations, you can refactor the code to eliminate inefficiencies, resulting in a more streamlined and performant application. Consider the simple scenario of using an enhanced for loop vs managing your own counter. Among other low-level tools like JMH, `javap` can help you learn what creates fewer or more optimal bytecode instructions. If you run `javap` against a class that performs these two operations: java for (int i = 0; i < list.size(); i++) { sum += list.get(i); } for (Integer i : list) { sum += i; } You can see from the bytecode that the first computes `.size()` each time through the loop while the enhanced for loop does something more optimal: java 4: iload_2 5: aload_0 6: getfield #19 // Field list:Ljava/util/List; 9: invokeinterface #25, 1 // InterfaceMethod java/util/List.size:()I 14: if_icmpge 42 17: iload_1 18: aload_0 19: getfield #19 // Field list:Ljava/util/List; 22: iload_2 23: invokeinterface #29, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object; vs. java 2: aload_0 3: getfield #19 // Field list:Ljava/util/List; 6: invokeinterface #25, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator; 11: astore_2 12: aload_2 13: invokeinterface #29, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z 18: ifeq 41 21: aload_2 22: invokeinterface #35, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object; Or, in short, prefer the enhanced for loop or at least an `Iterator`; that’s what the JDK does. SECURITY RESEARCH Security is paramount in software development. Bytecode analysis can help identify potential security vulnerabilities by revealing insecure coding practices or unintentional exposure of sensitive information. See if you can find a problem with the given bytecode: java public boolean verifyLogin(java.lang.String, java.lang.String); Code: 0: ldc #7 // String josh 2: aload_1 3: invokevirtual #9 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 6: ifeq 20 9: ldc #15 // String password 11: aload_2 12: invokevirtual #9 // Method java/lang/String.equals:(Ljava/lang/Object;)Z 15: ifeq 20 18: iconst_1 19: ireturn 20: iconst_0 21: ireturn What do you think is happening here? The first four instructions compare the first method parameter to the value “josh” and the next four instructions compare the second method parameter to “password”. If either doesn’t pass, then `iconst_0` is returned. If they both pass, then `iconst_1` is returned. If you guessed that a successful login is josh/password, then you are correct! CONCLUSION In the ever-evolving landscape of software development, the ability to read and analyze Java bytecode is a powerful skill. As we've explored in this article, bytecode is more than just a byproduct of the Java compilation process; it's a window into the inner workings of yours and others’ Java applications. By demystifying the complexities of bytecode, we unlock a plethora of opportunities for optimizing performance, enhancing security, and even reverse engineering. Did you find this article helpful? Then check out Josh Cumming's many video courses on Pluralsight which cover Java and the Spring framework in depth, such as "Secure Coding Practices in Java Applications" and "Securing Spring Data REST APIs." Josh C. Like many software craftsmen, Josh eats, sleeps, and dreams in code. He codes for fun, and his kids code for fun! Right now, Josh works as a full-time committer on Spring Security and loves every minute. Application Security holds a special place in his heart, a place diametrically opposed to and cosmically distant from his unending hatred for checked exceptions. More about this author * SUPPORT * Contact * Help Center * IP Allowlist * Sitemap * Download Pluralsight * Skills Plans * A Cloud Guru Plans * Flow Plans * COMMUNITY * Guides * Teach * Partner with Pluralsight * Affiliate Partners * Pluralsight One * Authors * COMPANY * About Us * Careers * Newsroom * Resources * INDUSTRIES * Education * Financial Services (FSBI) * Healthcare * Insurance * Non-Profit * Public Sector * NEWSLETTER Email Address:* I would like to receive emails from Pluralsight Submit Thank you! * A facebook icon * * * * -------------------------------------------------------------------------------- Pluralsight logo Copyright © 2004 - 2024 Pluralsight LLC. All rights reserved * Terms of Use * Privacy Notice * Modern Slavery Statement