有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

考虑到我得到了一个数组^ {< CD1>}和一个^ {< CD2>}的字符串表示形式。我怎样才能得到这个Object属于哪个Class

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

Iterating over Class array and then getting all instances of that class.Then convert each instance to its String representation and then check if it equals given String.

我面临的问题是,我如何获得所有的Instances? 我们可以使用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在这里代表什么类


共 (3) 个答案

  1. # 1 楼答案

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

    toString()方法返回对象的textual representation,但不能保证这将包括类名。例如,对于Strings,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());
    
  2. # 2 楼答案

    如果你拥有你想要搜索的类,你可以通过创建一个新类(我称之为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()拥有完全的控制权,并且您自己确保了这一点

  3. # 3 楼答案

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

    在大多数应用程序(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) ;
        }
    }
    

    如果给定字符串sample=“霍格沃茨城堡”;您可以使用以下选项:

    houseObj.toString().equals(sample);