1

I am newbie to java programming language.

My problem is: I want to read sys.input for a class name from console. Upon reading the name of the class, I want to generate that class automatically and call its method if that class exists already. my trial is here. Although I dont get any error, nothing happens. my kind regards.


class s1{
    public s1(){
        System.out.println(""+ s1.class);
    }
}
public class reflection {

    public static void main(String[] args) throws IOException, ClassNotFoundException{

        System.out.println("enter the class name : ");    
        BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
        String line = "reflection_N3."; 
        line+=reader.readLine();

        //System.out.println(line);

     // "name" is the class name to load
       Class clas = Class.forName(line);       
       clas.getClassLoader();     
    }
}
1
  • You're not doing anything with the class you load. What would you have expected to happen? Commented Sep 24, 2010 at 10:32

2 Answers 2

8

You are not creating an instance of the class. Try

Class clas = Class.forName(line);
Object obj = clas.newInstance();

However, the problem is, you can't do much with this object unless you know its exact type, and cast it to that type.

In this example, you could try casting it to your class type, e.g.

if (obj instanceof s1) {
  s1 myS1 = (s1) obj;
  myS1.s1();
}

However, this hardly works in real life, where you don't know the possible types in advance. The typical solution to this is to define an interface for a specific purpose, and require that the class implements that interface. Then you can downcast the class instance to that interface (throwing an exception if the cast fails), and call its interface methods, without needing to know its concrete type.

Or, as @helios noted, you can use reflection to obtain a method of the loaded class having a specific name.

Btw the Java convention is to start class names with uppercase, hence S1 and Reflection.

Sign up to request clarification or add additional context in comments.

2 Comments

Or using reflection to obtain the method, too class.getMethod(...); and invoke it method.invoke(obj, ...);
Thank you for your solution.also,I will be more careful about naming classes.
2

You're only obtaining the ClassLoader, you're never actually constructing an object of the specified class.

Use clas.newInstance() if you want to call the default constructor, or investigate Class.getConstructor(...) if you need to call a specific constructor.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.