java - java中的反射?

标签 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();
}

但是,这在现实生活中几乎行不通,因为您事先不知道可能的类型。典型的解决方案是为特定目的定义一个接口(interface),并要求该类实现该接口(interface)。然后您可以将类实例向下转换为该接口(interface)(如果转换失败则抛出异常),并调用其接口(interface)方法,而无需知道其具体类型。

或者,正如@helios 指出的那样,您可以使用反射来获取具有特定名称的已加载类的方法。

顺便说一句,Java 约定是以大写开头的类名,因此 S1Reflection

关于java - java中的反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786126/

相关文章:

Java 最佳实践 : Class with only static methods

java - 使用 Android USB Host API 读取我的 USB 游戏 Controller /或其他 USB 设备数据

java - 为什么我在将 json 文件读入我的对象后得到 NPE?

java - 什么时候将实例变量设为私有(private)?

java - 处理 hibernate UnsupportedOperationException : Can't write to a readonly object

java - 文本中的子字符串替换

Java 对 List<Value> 的 HashMap 值进行排序

java - Java 中泛型的魔力

java - 如何在 java 类中获取 TextView 值作为字符串并设置它?

Java if 语句被跳过