仅反射类初始化一次

时间:2017-08-09 00:41:39

标签: java reflection

我想用Reflection来读取每个子类扩展类Demo的显示功能。

class Demo{
    public abstract void display();
}    

我想clazz只初始化一次,我不知道怎么检查clazz是否存在,请帮帮我:D

public static void getDisplay(Class<? extends Demo> clazz) throws 
                   InstantiationException, IllegalAccessException {
        return clazz.newInstance().display();
}

2 个答案:

答案 0 :(得分:3)

根据您的逻辑尝试以下代码。

Class对象上的

getSuperclass()方法返回类的超类。如果此Class表示Object类,接口,基本类型或void,则返回null。

    // First took class name by using Class.forName(String fullyClassifiedClassName).   
    Class<?> superClass = Class.forName("childclass").getSuperclass();
    System.out.println(superClass); // prints "childclass"
    System.out.println(Object.class.getSuperclass()); // prints "null"

或尝试此代码,它在我的系统上正常工作。我希望这会有所帮助。

public class Main {
    public static void main(String[] args) {
      clazz c = new clazz();
        c.display();
    }
}
   class Demo
   {
      // Apply superclass's logic here
   }

    // sub class
class clazz extends Demo {
   public void display()
   {
       Demo val1 = new Demo();
      clazz val2 = new clazz();
      Class cls;
      cls = val1.getClass();
      System.out.println("Super class name = " + cls.getName());
      /* returns the superclass of the class(superClass) represented
         by this object */
      cls = cls.getSuperclass();
      System.out.println("Super is inherited by another class " + cls.getName());
      cls = val2.getClass();
      System.out.println("child Class Name " + cls.getName());
      /* returns the superclass of the class(subClass) represented
         by this object */
      cls = cls.getSuperclass();
      System.out.println("Child class extended by " + cls.getName());
   }
}

答案 1 :(得分:1)

为什么不将getDisplay转换为类的成员方法?

这样你就可以在getDisplay所在的类中保存一个clazz名称和实例的列表或映射。检查列表/映射中的成员身份并返回display()(如果存在)。如果它不存在,请将其放在列表/地图上,然后返回display()。