I'm working on a project and one requirement is if the 2nd argument for the main method starts with “/
” (for linux) it should consider it as an absolute path (not a problem), but if it doesn't start with “/
”, it should get the current working path of the class and append to it the given argument.
I can get the class name in several ways: System.getProperty("java.class.path")
, new File(".")
and getCanonicalPath()
, and so on...
The problem is, this only gives me the directory in which the packages are stored - i.e. if I have a class stored in ".../project/this/is/package/name
", it would only give me "/project/
" and ignores the package name where the actual .class files
lives.
Any suggestions?
EDIT: Here's the explanation, taken from the exercise description
sourcedir can be either absolute (starting with “/”) or relative to where we run the program from
sourcedir is a given argument for the main method. how can I find that path?
The package for a class can be obtained using the java. lang. Class. getPackage() method with the help of the class loader of the class.
Java Class getName() Method The getName() method of java Class class is used to get the name of the entity, and that entity can be class, interface, array, enum, method, etc. of the class object. Element Type.
Yes, it will work.
Use this.getClass().getCanonicalName()
to get the full class name.
Note that a package / class name ("a.b.C") is different from the path of the .class files (a/b/C.class), and that using the package name / class name to derive a path is typically bad practice. Sets of class files / packages can be in multiple different class paths, which can be directories or jar files.
There is a class, Class
, that can do this:
Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass(); // if you want to use the current class
System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());
If c
represented the class MyClass
in the package mypackage
, the above code would print:
Package: mypackage
Class: MyClass
Full Identifier: mypackage.MyClass
You can take this information and modify it for whatever you need, or go check the API for more information.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With