[英]Reflection in java?
我是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();
}
但是,这在现实生活中几乎不起作用,因为您事先不知道可能的类型。 典型的解决方案是为特定目的定义接口,并要求类实现该接口。 然后,您可以将类实例向下转换到该接口(如果强制转换失败,则抛出异常),并调用其接口方法,而无需知道其具体类型。
或者,如@helios所述,您可以使用反射来获取具有特定名称的已加载类的方法。
顺便说一句,Java惯例是使用大写字母开头类名,因此S1
和Reflection
开头。
您仅获得ClassLoader
,而从未真正构造指定类的对象。
如果要调用默认构造函数,请使用clas.newInstance()
如果需要调用特定的构造函数,请使用Class.getConstructor(...)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.