从Object的String表示中确定Class

时间:2015-11-01 08:37:23

标签: java

考虑我给出一个Classes数组和Object的字符串表示。如何获取Class Object所属的文件?

我想到了这种方法,但我不知道如何实现它:

  

迭代Class数组,然后获取它的所有实例   然后将每个实例转换为String表示形式   检查它是否等于给定的字符串。

我遇到的问题是如何获得Instances的所有Class? 如果所有getInstance()类都是Singleton,我们可以使用import java.util.*; public class Class_instance { public static void main(String args[]){ List<Class> class_list = new ArrayList<Class>(); Test_class x = new Test_class(); Test y = new Test(); class_list.add(x.getClass()); class_list.add(y.getClass()); String ex = x.toString(); } } ,但如果不是,那么该怎么办?

请澄清我是否有任何误解。

ex

如何知道<? $form = ActiveForm::begin( [ 'options' => ['class' => 'form-horizontal'], 'fieldConfig' => [ 'template' => '<div class="control-group">{input}</div>.<div class="control-group error">{error}</div>', ], ]); ?> <div class="control-group"> <b>Регистрация</b> </div> <? echo $form->field($model, 'login', ['template' => "{input}{error}", 'inputOptions' => array('placeHolder' => 'Логин')]); echo $form->field($model, 'password', ['template' => "{input}{error}", 'inputOptions' => array('placeHolder' => 'Пароль')]); echo $form->field($model, 'repassword', ['template' => "{input}{error}", 'inputOptions' => array('placeHolder' => 'Повторите пароль')]); ?>代表哪个类?

3 个答案:

答案 0 :(得分:3)

简短回答 - 不,这不会奏效。

toString()方法返回对象的textual representation,但不保证会包含类名。例如,对于String s,toString()返回字符串的值。特别是任何文本表示可能来自字符串。

如果您有想要查找的特定类列表(并且它们具有可识别的值),您可以编写可识别其toString值的正则表达式。

直接使用Class对象更有可能是您在此之后所做的事情:

  public static void main(String [] args){
      Class[] possibleClasses= {String.class, Integer.class};
      System.out.println(identifyClass("string", possibleClasses));
      System.out.println(identifyClass(4, possibleClasses));
  }

  @SuppressWarnings("raw")
  public static Class identifyClass(Object o, Class[] possibleClasses){
      // Ignore null inputs
      if (o==null){
          return null;
      }

      // Find the first entry which matches o
      for (Class c : possibleClasses){
          if (c.isInstance(o)){
              return c;
          }
      }

      // If no matches are found, return null.
      return null;
  }

虽然说,也许这就足够了?

System.out.println(ex.getClass().getName());

答案 1 :(得分:1)

如前所述,我们需要知道字符串表示的含义。

在大多数应用程序(AFAIK)中,instanceof应该足以检查对象是否属于某个类。另一种方法是定义覆盖toString方法

public class House {
    public String address;
    public String type;

    public House(String add){
        this.address = add;
    }  

    @Override
    public String toString() {
        return (address + "-" + type) ;
    }
}

如果给出一个String sample =&#34; Hogwart-Castle&#34 ;;您可以使用以下内容:

houseObj.toString().equals(sample);

答案 2 :(得分:0)

如果您拥有要搜索的类,则可以通过创建一个新类(我称之为MyObject)并使用您在该类的新对象时填充的静态字段来跟踪其实例创建,然后扩展您想要跟踪这个新类的类。

public class MyObject {
    private static Map<Class<?>, List<WeakReference<?>>> instances = new HashMap<>();

    public MyObject() {
        if (!instances.containsKey(getClass())) {
            instances.put(getClass(), new ArrayList<>());
        }
        instances.get(getClass()).add(new WeakReference<>(this));
    }

    public static List<Object> getInstances(List<Class<?>> classes) {
        List<Object> result = new ArrayList<>();

        for (Class<?> clazz : classes) {
            if (instances.containsKey(clazz)) {
                Iterator<WeakReference<?>> iterator = instances.get(clazz).iterator();
                while (iterator.hasNext()) {
                    WeakReference<?> ref = iterator.next();
                    if (ref.get() == null) {
                        iterator.remove();
                    } else {
                        result.add(ref.get());
                    }
                }
            }
        }
        return result;
    }
}

然后你可以像这样使用它:

public class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog("I'm a dog");
        Dog d2 = new Dog("I'm an animal");
        Cat c1 = new Cat("I'm an animal");

        List<Class<?>> classList = new ArrayList<>();
        classList.add(Dog.class);
        find("I'm an animal", classList); // Found a Dog

        classList.add(Cat.class);
        find("I'm an animal", classList); // Found a Dog and a Cat

        find("I'm a dog", classList); // Found a Dog

    }

    private static void find(String str, List<Class<?>> classes) {
        for (Object o : MyObject.getInstances(classes)) {
            if (o.toString().equals(str)) {
                System.out.println("Found a " + o.getClass().getSimpleName());
            }
        }
    }
}

我的Dog类(以及类似Cat类)如下所示:

public class Dog extends MyObject {
    String description;

    public Dog(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return description;
    }
}

请注意toString()没有返回对象的唯一表示形式(如我的示例所示),除非您完全控制对象的toString()并确保自己确定