Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从对象的字符串表示确定类_Java - Fatal编程技术网

Java 从对象的字符串表示确定类

Java 从对象的字符串表示确定类,java,Java,假设我得到了一个类数组和一个对象的字符串表示。如何获取此对象所属的类 我想过这种方法,但不知道如何实现: 迭代类数组,然后获取该数组的所有实例 然后将每个实例转换为其字符串表示形式,然后 检查它是否等于给定的字符串 我遇到的问题是如何获取该类的所有实例? 如果都是单例类,我们可以使用getInstance,但如果不是呢 如果我有任何误解,请澄清我的想法 import java.util.*; public class Class_instance { public static void

假设我得到了一个类数组和一个对象的字符串表示。如何获取此对象所属的类

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

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

我遇到的问题是如何获取该类的所有实例? 如果都是单例类,我们可以使用getInstance,但如果不是呢

如果我有任何误解,请澄清我的想法

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类在这里表示什么?

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

在大多数应用程序中,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) ;
    }
}
如果给定字符串示例=霍格沃茨城堡;您可以使用以下选项:

houseObj.toString().equals(sample);

简短的回答-不,这行不通

toString方法返回对象的名称,但不能保证其中包含类名。例如,对于字符串,toString返回字符串的值。特别是,任何文本表示都可以来自字符串

如果您有一个要查找的类的特定列表,并且它们具有可识别的值,那么您可以编写正则表达式来识别它们的toString值

直接使用类对象更有可能是您在此所追求的:

  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());

如果您拥有要搜索的类,您可以通过创建一个新类(我称之为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;
    }
}

请注意,toString不会返回我的示例中所示的对象的唯一表示形式,除非您完全控制该对象的toString,并且您自己确保它。

定义字符串表示形式?你是说toString调用的结果吗?或者你的所有物品都遵循一些标准吗?我们在谈论什么?老实说,如果我们谈论的是随机对象,那么,对不起,如果没有更多的工作,你的工作几乎是不可能的。是的。。。。我的意思是toString调用。对不起,我不明白你的意思是什么标准。我给出了我尝试过的示例。toString不是指定的东西。每个程序员都可以决定类的toString方法在toString中返回什么。例如,它只应该是类的良好表示,但这并不意味着它必须包含类名。因此,如果您想为所有可能的类编写代码,这是不可能的。如果只为类编写代码,那么就可以为toString方法创建一些模式,以确保它包含限定的类名。如果没有你的用例,很难说。好吧,我明白你的意思了……但即使在这种情况下,我们如何获得给定类的所有实例如果你控制所有类,那么你可以,例如,向每个类添加一个静态列表,并将对象添加到构造函数中的列表中。。。当然,整件事闻起来还是个坏主意,但我认为这只是一个简单的练习。@sean…谢谢你的回答…我知道你的方法,但是我们如何获得教室的所有物品…我是说如何获得houseObj@BhavyaSharma你需要为你的主类显示e代码,以便我们向你提供建议。AFAIK不是一个单一的函数调用,它可以让您获得在e程序运行时内创建的所有对象。您将需要一个数据结构来存储所有创建的对象。@sean….好的,这意味着为了实现此行为,我需要覆盖toString方法。我尝试了类似的方法,但效果很好:class_list.geti.getSimpleName.equalsex。我已经覆盖了toString方法,如返回this.getClass.getSimpleName;这意味着无法获取类的所有运行时实例?
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());
            }
        }
    }
}
public class Dog extends MyObject {
    String description;

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

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