Java opening class file

Java Class File

A Java class file is a file containing Java bytecode and having .class extension that can be executed by JVM. A Java class file is created by a Java compiler from .java files as a result of successful compilation. As we know that a single Java programming language source file (or we can say .java file) may contain one class or more than one class. So if a .java file has more than one class then each class will compile into a separate class files.
For Example: Save this below code as Test.java on your system.

For Compiling:

After compilation there will be 3 class files in corresponding folder named as:

A single class file structure contains attributes that describe a class file.
Representation of Class File Structure

Elements of class file are as follows:

  1. magic_number: The first 4 bytes of class file are termed as magic_number. This is a predefined value which the JVM use to identify whether the .class file is generated by valid compiler or not. The predefined value will be in hexadecimal form i.e. 0xCAFEBABE.
    Now let’s see what happen when JVM will not find valid magic number. Suppose we have a .java file named as Sample.java as follows and follow step by step process on your system.
// class Declaration class Sample < public static void main(String[] args) < System.out.println("Magic Number"); >>

Step 1: Compile using javac Sample.java
Step 2: Now open the Sample.class file. It will looks like following.

Sample.class File

Runtime Exception Due to Invalid magic number

Step 3: Now erase at least single symbol from this Sample.class file from starting of file and save it.
Step 4: Now try to run this using java Sample command and see the magic i.e. you will get run time exception (See the highlighted text in below image):

Note: This can vary depending on how much you remove the .class file data.

Note: Lower version compiler generated .class file can be executed by high version JVM but higher version compiler generated .class file cannot be executed by lower version JVM. If we will try to execute we will get run time exception.

Читайте также:  Гексагональная сетка на java

This demonstration is for Windows OS as follows:

Step 1: Open a command prompt window and try to check java compiler version and JVM version using following commands respectively (Highlighted text in image are the commands)
Output for 1.8 version will be:
Java Compiler Version
JVM Version

Step 2: Now check with another version which may be higher or lower than already installed.thisDownload link.
And install this to your PC or laptops and note the installation address.
Step 3: Open a second command prompt window and set the path of bin folder of installed jdk installed during 2nd step. And check for Java compiler version ad JVM version.
Checking Version of JDK 1.6
Step 4: Now on 1st command prompt compile the any valid .java file. For example: See above Sample.java file. Compile it as:
Compiling with Compiler Version 1.8
Step 5: Now on 2nd command prompt window try to run the above compiled code class file and see what happen. There is a run time exception which I have highlighted in below image.

Runtime Exception Due to Invalid major and minor Version of class file

Note: Internally jdk 1.5 version means 49.0 and 1.6 means 50.0 and 1.7 means 51.0 etc. class file version where the digits before the decimal point represent the major_version and digits after decimal point represents the minor_version.

  1. constant_pool_count: It represents the number of the constants present in the constant pool (When a Java file is compiled, all references to variables and methods are stored in the class’s constant pool as a symbolic reference).
  2. constant_pool[]: It represents the information about constants present in constant pool file.
  3. access_flags: It provide the information about the modifiers which are declared to the class file.
  4. this_class: It represents fully qualified name of the class file.
  5. super_class: It represents fully qualified name of the immediate super class of current class. Consider above Sample.java file. When we will compile it, then we can say this_class will be Sample class and super_class will be Object class.
  6. interface_count: It returns the number of interfaces implemented by current class file.
  7. interface[]: It returns interfaces information implemented by current class file.
  8. fields_count: It represents the number of fields (static variable) present in current class file.
  9. fields[]: It represent fields (static variable) information present in current class file.
  10. method_count: It represents number of methods present in current class file.
  11. method[]: It returns information about all methods present in current class file.
  12. attributes_count: It returns the number of attributes (instance variables) present in current class file.
  13. attributes[]: It provides information about all attributes present in current class file.
Читайте также:  Webpack css modules scss

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support opening .class files directly within vscode #3

Support opening .class files directly within vscode #3

Comments

It may be a stupid question I am using Visual Studio Code on a MAC and I cannot get the decompiler to work. I load a class file into the editor then go to definition but nothing happens?

The text was updated successfully, but these errors were encountered:

@dgileadi Any update is available for this?

@railsfactory-prabhu not right now. I have looked into it, though. There are two issues that make it hard.

First, vscode doesn’t support directly opening binary files, so for now I’d need to offer something like right-clicking on the .class file and choosing Decompile.

Second, the awesome Redhat Java tools I’m piggy-backing on don’t seem to have a method for directly opening a .class file. This means that I need to either make a fairly complicated workaround (search for the type by name and then request its contents) or build my own language server. Neither of those is simple, so I’m deferring for now. PR’s welcome!

Any update on this? Why does TextEdit seem to be able to read most of a class file whereas VS can’t read any of it?

As mentioned above it’s a limitation of vscode and the Redhat Java tools. If you’re able to figure out a way to make it work I’d be happy to incorporate your code.

Within that java file you can then right-click on that class symbol and choose Go to Definition.

This takes me back to the class (.java file) and not .class file. No matter what I do, I can’t seem to make it work, unfortunately.

This takes me back to the class (.java file) and not .class file. No matter what I do, I can’t seem to make it work, unfortunately.

I’ve only seen this kind of behavior when the RedHat Java tools aren’t working properly on my project. The decompiler extension depends on the RedHat Java extension to work properly.

Читайте также:  Write hex in java

I may be even denser here.. but you are talking about .class files.. But I can’t even get to that stage..

image

I can see the .jar file but this is now the point where I am stuck.
I don’t have a java project I am not writing java. All I want to do is look inside the .jar file..

image

I thought it would look something like this below, but within VSCode.

Am I being unrealistic?

Yes, unfortunately with the current version of the plugin you’re being unrealistic. If you had a Java project with your jar as one of the dependencies then it would work—Ctrl+T would allow you to enter the name of a class in the jar to examine and you’d be able to view its decompiled source. Or you could use Red Hat’s Java Dependencies view to browse through the jar and click on individual classes within it.

However being able to examine arbitrary .class files or classes within arbitrary .jar files is not something this plugin can do—it relies on Red Hat’s java tools for loading class files, and they only work with dependencies in Java projects.

No problem. I have no idea what the jar is doing. I know we call it via command line, but the rest of it is black magic.

const command = `java -jar $jarFile> generate -i $swaggerFile> -l typescript-fetch -o $outDir>`;

I have no idea what classes or files are within it. I will get the Java Decompiler from the above image. Thank you for your help.

Источник

Оцените статью