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