我是 java 编程语言的新手。
我的问题是: 我想从控制台读取 sys.input 的类名。读取类的名称后,我想自动生成该类并在该类已经存在的情况下调用它的方法。 我的审判就在这里。虽然我没有收到任何错误,但什么也没有发生。 谨致问候。
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();
}
}
最佳答案
您不是在创建类的实例。尝试
Class clas = Class.forName(line);
Object obj = clas.newInstance();
但是,问题是,除非您知道它的确切类型并将其转换为该类型,否则您不能对该对象做很多事情。
在此示例中,您可以尝试将其转换为您的类类型,例如
if (obj instanceof s1) {
s1 myS1 = (s1) obj;
myS1.s1();
}
但是,这在现实生活中几乎行不通,因为您事先不知道可能的类型。典型的解决方案是为特定目的定义一个接口(interface),并要求该类实现该接口(interface)。然后您可以将类实例向下转换为该接口(interface)(如果转换失败则抛出异常),并调用其接口(interface)方法,而无需知道其具体类型。
或者,正如@helios 指出的那样,您可以使用反射来获取具有特定名称的已加载类的方法。
顺便说一句,Java 约定是以大写开头的类名,因此 S1
和 Reflection
。
关于java - java中的反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786126/