Java—如果对象的类型与字符串匹配,则使用反射将数据附加到对象

Java—如果对象的类型与字符串匹配,则使用反射将数据附加到对象,java,class,reflection,Java,Class,Reflection,所以这里有一个问题要问java专家 我在文本文件中保留了一些定义,假设它们是属性文件。我有很多不同的对象,它们都实现了一个接口,我们称之为Cardable。它保证方法附加这些定义并检索它们以在应用程序中显示 public interface Cardable { public void attach(Card c); public Card retrieve(); } 现在,当我构建这些对象的静态列表(其类型各不相同)时,我会看到该类型是否与定义中声明的一组类匹配,如下所示 Thi

所以这里有一个问题要问java专家

我在文本文件中保留了一些定义,假设它们是属性文件。我有很多不同的对象,它们都实现了一个接口,我们称之为
Cardable
。它保证方法附加这些定义并检索它们以在应用程序中显示

public interface Cardable {
   public void attach(Card c);
   public Card retrieve();
}
现在,当我构建这些对象的静态列表(其类型各不相同)时,我会看到该类型是否与定义中声明的一组类匹配,如下所示

Thing.Bag.LeatherBag= ... (definitions)
如果我们正在创建这个类(定义浓缩以显示想法)

这个过程是在预加载阶段浏览列表,并将最具体的卡分配给给定的类。这将被任意定义为,例如,指定更多的类(Thing.Bag.LeatherBag将比Bag.LeatherBag更具体。)


一旦我将类名从字符串中分离出来,我将如何使用instanceof检查对象(一旦我们验证它实现了
Cardable
)是否是所有指定类的实例?Instanceof似乎与类型有关,但与包含类型/类名的字符串无关。

如果我理解正确,您有一个由其字符串名表示的类,您需要确定它是否实现了由其字符串名表示的一组接口,以及它是否扩展了由其字符串名表示的一组类。你可以在课堂上这样做

void无效(字符串类名称){
Class clazz=Class.forName(className);
类[]接口=clazz.getInterfaces();
ArrayList超类=新的ArrayList();
Class temp=clazz.getSuperclass();
超类。添加(临时);
while(temp!=Object.class){
temp=temp.getSuperclass();
超类。添加(临时);
}
}

这将使您有
接口
保存所有类的接口,而“超类”保存所有类的超类。您可以在这些类对象上调用Class#getName,并将它们与接口/类的字符串表示形式进行比较,以查看所讨论的类是否符合您的条件。

…如果该对象(一旦我们验证它实现了Cardable)
若要检查某个对象是否是实现Cardable的类的实例,可以使用
Cardable.class.isInstance(您的对象)
。您也可以使用
Class.forName(“full.name.of.YourClass”).isInstance(yourObject)
检查它是否是
YourClass
的类型,但要小心,因为它也会为
超类返回true。isInstance(subClass)
.Pshemo,这应该是一个答案。。。!我觉得我的评论只回答了你问题的一部分,所以我决定不把它作为答案发布。如果您愿意,您可以根据我的评论创建自己的完整答案并接受。我不介意:)所以类似于
公共布尔hasClass(String[]cnames,Object o){for(String s:cnames){if(!Class.forName.isInstance(o)){return false;}}}return true;}
?我把它复杂了一点=does
Class.forName(className)
为您提供一个类型,然后您可以对
对象使用
instanceof
来查看未知类型的对象是否是该类的实例?您可以使用,如
class clazz=class.forName(className);clazz.isInstance(对象)
public class LeatherBag extends Bag {
   ...
}

public class Bag extends Thing {
   ...
}

public class Thing implements Cardable {
   ...
}
void isValid(String className) {
    Class clazz = Class.forName(className);
    Class[] interfaces = clazz.getInterfaces();
    ArrayList<Class> superclasses = new ArrayList<>();
    Class temp = clazz.getSuperclass();
    superclasses.add(temp);
    while(temp != Object.class) {
        temp = temp.getSuperclass();
        superclasses.add(temp);
    }
}