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