繁体   English   中英

用java反射吗?

[英]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惯例是使用大写字母开头类名,因此S1Reflection开头。

您仅获得ClassLoader ,而从未真正构造指定类的对象。

如果要调用默认构造函数,请使用clas.newInstance()如果需要调用特定的构造函数,请使用Class.getConstructor(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM