Main class
public class Main {
public static void main(String[] args) {
// Class load
A a = new A();
a.msg();
}
}
A class
public class A {
public void msg() {
System.out.println("msg");
}
}
I have written code in the main class that calls a msg() method of class A
After I created the jar file, I pull out A.class.
Then the path will have a jar file with missing A.class, and A.class.
A a = new A();
a.msg();
How do I dynamically load and run A.class without making any changes to the above code?
Please help me..
Looks like you want to load a class dynamically. I would recommend you to create a jar and load it using URIClassLoader. There is a really good answer here:- How should I load Jars dynamically at runtime?
A.class has to be in the classpath somewhere for the code to run. you can put it in a jar of its own, and add the second jar to the classpath. Then the class loader can find it.
I knew that when a class has an inner class then this class will be compiled to two class files. Today I have codes as below
public class GenericDeserializer {
public static void main(String[] args) {
String cityPageLoadJson = "{\"count\":2,\"pageLoad\":[{\"id\":4,\"name\":\"HAN\"},{\"id\":8,\"name\":\"SGN\"}]}";
Type type = new TypeToken<GenericResult<City>>() {
}.getType();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
GenericResult<City> cityPageLoad = gson.fromJson(cityPageLoadJson, type);
for (City city : cityPageLoad.getPageLoad()) {
System.out.println(gson.toJson(city));
}
}
}
Although the above one has no inner class, java compiler still creates two class files:
GenericDeserializer.class
GenericDeserializer$1.class
Using Java Decompiler tool, I see content of the second
package net.tuandn.training.lesson.gson;
import com.google.gson.reflect.TypeToken;
import net.tuandn.training.model.City;
import net.tuandn.training.model.GenericResult;
final class GenericDeserializer$1 extends TypeToken<GenericResult<City>>
{
}
Could anybody please explain why this class is created?
And when are multiple class files created on compiling?
Thank a lot!
Two class files are generated because you are using an anonymous class in the following statement:
TypeToken<GenericResult<City>>() {
.....
}
Each anonymous class file uses the same name as of the container class and appends a $1/$2 and so on.
new TypeToken<GenericResult<City>>() {
}
creates an anonymous inner class. Anonymous inner classes, just like inner classes are compiled to separate class files. Since anonymous class don't have name, that is why numbers are used to generate unique names for each such classes. The number you see there after $ is the numbering for that anonymous class, as they come in order in your enclosing class.
If you use more anonymous classes like that, the number will increment by 1. So for more anonymous classes, the generated class files would look like:
GenericDeserializer$1.class
GenericDeserializer$2.class
GenericDeserializer$3.class
GenericDeserializer$4.class
....
For inner classes however, the value after the $ is the name of the inner class, as you already would have noticed.
And when are multiple class files created on compiling?
Yes, those classes are generated, when you compile your top-level class.
Simple enough, your decompiled class shows
final class GenericDeserializer$1 extends TypeToken<GenericResult<City>>
So you have a TypeToken<GenericResult<City>> somewhere.
Looking through your code we see
Type type = new TypeToken<GenericResult<City>>() { /* anonymous inner class */ }.getType();
There's an anonymous inner class declaration there which will therefore get its own class file with $X suffix.
I have a program called MyProgram.java. I want to run it from different directory which will be run on another machine. So I made a directory and copied MyProgram.class file and made a .bat file that runs it (Run.bat) which includes the command: #java MyProgram.
This didn't work, I had to copy SPVerification$1.class that was generated from Eclipse in order to make it work.
What is this XXX$1.class files and why do I need them beside the XXX.class file in order to run an application?
If your .java file have inner/nested classes , post compilation those are generated as Yourclass$xxx.class files by the java compiler.
Inner class definitions produce additional class files. These class
files have names combining the inner and outer class names, such as
MyClass$MyInnerClass.class. - Source
Example (edit)
Considering following Class definition
// MyClass class
public class MyClass{
// Inner class Test1
class Inner1 {
}
// Inner class Test2
class Inner2{
}
public static void main(String [] args) {
// Anonymous inner class 1
new Object() {
};
// Anonymous inner class 2
new Object() {
};
System.out.println("Bunch of $ files :)");
}
}
Will generate these following Files
MyClass.class
MyClass$Inner1.class
MyClass$Inner2.class
MyClass$1.class
MyClass$2.class
They are anonymous inner classes. In other words, when you have a piece like
class OuterClass {
// ...
void method() {
Thread t = new Thread(new Runnable() {
// ... code implementing Runnable interface ...
});
// ... code to use t or whatever
}
}
That generates anonymous inner class, in this case implementing the Runnable interface, and compiled code of that class goes to a OuterClass$<number>.class file. You can have more than one such class, with increasing number in the .class file name.
Note that syntax is exactly the same even if you extend a class with the anonymous inner class, instead of implementing an interface. This is a slightly different from creating named classes, where you need to use implements and extends as appropriate.
I have a number of .java classes compiled with Eclipse and over in the /bin directory I see that not only do I have various .class files corresponding to my Java classes but also a few with a dollar sign in the file name.
Example: I have a class called RangeFinder and in the /bin I see a RangeFinder.class and also a RangeFinder$1.class.
What is the significance of the latter?
(I am on Ubuntu and I am using Eclipse EE Indigo.)
These are anonymous inner classes in bytecode form. The compiler gives them numerical names starting with 1 (it is not allowed in Java to have a class name starting with a number, but it is possible in the bytecode, so the compiler does it to avoid name clashes, I guess). Normal (named) inner classes are named like OuterType$InnerType.class.
Each .java source file can contain definitions for multiple Java classes. However, every .class file can only contain the bytecode for a single class.
So, if you have a file Foo.java that looks like this:
public class Foo {
public class Inner {
…
}
public void method() {
widget.addListener(new Listener() {
public void listen() {…}
}
}
}
class Bar {
…
}
It will compile into the following files:
Foo.class
Foo$Inner.class
Foo$1.class
Bar.class
Anonymous classes are assigned numbers as "names", I believe in the order in which they're found in the enclosing class.
Is there any way to compile a java program without having the java file name with its base class name.
If so, please explain..
To answer the question take a look at this example:
Create a file Sample.java
class A
{
public static void main(String args[])
{
String str[] = {""};
System.out.println("hi");
B.main(str);
}
}
class B
{
public static void main(String args[])
{
System.out.println("hello");
}
}
now you compile it as javac Sample.java and run as java A then output will be
hi
hello
or you run as java B then output will be hello
Notice that none of the classes are marked public therefore giving them default access. Files without any public classes have no file naming restrictions.
Your Java file name should always reflect the public class defined within that file. Otherwise, you will get a compiler error. For example, test.java:
public class Foo {}
Trying to compile this gives:
[steven#scstop:~]% javac test.java
test.java:1: class Foo is public, should be declared in a file named Foo.java
public class Foo {
^
1 error
So you must have your filename match your public class name, which seems to render your question moot. Either that or I don't understand what you're asking... spending some time explaining what you are actually trying to achieve would go a long way towards asking a more effective question :)
As long as you don't have a public class in your source file, you can name your source file to any name and can compile. But, if you have a public class in your source file, that file should have the name same as your class name. Otherwise, compiler will throw an error.
Example:
Filename: TestFileName.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,World\n");
}
}
Compiling: javac TestFileName.java
Error:
TestFileName.java:1: class HelloWorld is public, should be declared in a file named HelloWorld.java
public class HelloWorld
^
1 error
No, the public class name must match the file name. Inner, non public, class names may differ.
You must have a public class with the same name as the file name. This is a Very Good Thing. You CAN have secondary classes inside the same file as long as they are not public. They can still be "default" though, so they can still be used by other classes in the same package.
This should not be done for the most part. Java's naming patterns regarding classes and packages are one of the bigger advantages it has--makes a programmers life easier at no cost.
You can use the Java Compile API and compile any java source you wish, the source need not come from a file or could come from a file with an unrelated name. It depends on how obtuse you want to develop your program. ;)
yes, we compile a java file with a different name than the class, provided that there should not be any public class in that file.
If there is any public class in file then in that case you have to give that name as file name. But if your class does not contain any public class then you can give any name to you class.
Please refer below example to make it more clear:
file name : sample.java
class A
{
public static void main(String args[])
{
System.out.println("hi in Class A");
}
}
class B
{
public static void main(String args[])
{
System.out.println("hello in class B");
}
}
then compile it with(windows) : javac sample.java
then run it : java A
output : hi in Class A
then run it : java B
output : hello in class B
Please check and confirm.
It is not necessary to name your file same as the name of the class it has, until this class is public. Though it is a good practice to name the file same as the name of class.
The compiler will compile your file successfully and make a dot class file. Now at the run time you need to give class name to the JVM for that you have to keep the name of the class, which has main method, in your mind. If you keep both the file name and the class name same, it will become easy to remember the name of the compiled dot class file.
for example:
file Dummy.java
class Dummy
{
public static void main(String args[])
{
System.out.println("This is Dummy class running");
}
}
to run the above code we will use :
Javac Dummy.java // to compile
Java Dummy //to run
example:
file Dummy.java
class Diff
{
public static void main(String args[])
{
System.out.println("This is Diff class running");
}
}
to run the above code we will use :
Javac Dummy.java // to compile
Java Diff //to run
I guess what he means is the .java file is named differently than the actual class defined inside it.
I guess this is not possible.
No. You could write a shell script to rename the .java file before compiling it, but javac requires that filenames = class names.
(Also in windows, it's case insensitive, so ASDF.java can compile Asdf.class)
yes, you can choose any name for the file (.java). there is no matter to what are the name of classes in that file means that class names may be totaly different from the file name.
you should compile the program with file name and you should run the program with the class name in which the main method exist.
main methods may be multiple in different classes so you should run it with the class name in which the main method you want to run......
we can save the file tootle different name of class name because in java we compile the program but we run the method.
we have to compile our program with file name and run our class name
Yes,it is possible to compile a java source file with different file name but you need to make sure none of the classes defined inside are public...when you compile the source file the corresponding .class files for the classes inside the source file are created.
Yes,you can save your java source code file with any other name, not same as your main class name but when you comiple it than byte code file name will be same as your main class name. So for your ease of not to memorize to many names for java code run, You need to have your file name same as your main class than only your file name and byte code file will be with same name.
If class is not public you can save it using other name like if classname is Simple then save it Hard.java.
complie->Hard.java
run->Simple.java
Save your java file by .java only.
compile javac .java
run java yourclassname
For example if my program main class name is A then
save by .java only
compile by javac .java
run by java A
yes, we can compile a java file with a different name than the class, provided that there should not be any public class in that file.
If there is any public class in file then in that case you have to give that name as file name. But if your class does not contain any public class then you can give any name to you class.
Please refer below example to make it more clear:
file name : example.java
class A
{
public static void main(String args[])
{
System.out.println("You are in Class A");
}
}
class B
{
public static void main(String args[])
{
System.out.println("You are in class B");
}
}
then compile it with : javac example.java
then run it : java A
output : you are in Class A
then run it : java B
output : you are in class B
Please check and confirm.
You can write more than one main methods in java because java provides main method overloading in which main method can also be overloaded . Once you compile the file here example.java
Compiler create .class file which contains main method when you run the file with java A it will run the A.class file whih contains the main method of class A and that output will be display on you screen ,but when you run this file with java B ,It runs the B.class file which provides main method of B class
So your code is run successfully
Yes. This can be done.
The main reason for the class and file name to be same are to make the job of the complier easy to check which class it needs to run, in the whole list of the Java classes.
So it's a good practice to have filename and class name as same.
And you have compile and run a class with different name other than the filename, If you don't have any public methods in this class.
By convention, the name of the main class should match the name of the file that holds the program. You should also make sure that the capitalization of the filename matches the class name.
The convention that filenames correspond to class names may seem arbitrary. However, this convention makes it easier to maintain and organize your programs. Furthermore, in some cases, it is required.
According to the other answers the only viable solution is to somehow determine the classname from the source, then use it to rename the file to proper name and compile it as usual.
Another option is to alter the package and class name in the source to match file name:
sed -i -r "0,/package/s/^\s*package .*?;/package new.klass.pkg;/" %1
sed -i -r "0,/class/s/public\s+class .+?\{/public class NewClassName {/" %1
Via How to use sed to replace only the first occurrence in a file?
You can have your java file even without name ( simply ".java" ). Only thing is you should not have any public class in your file.