考虑我给出一个Classes
数组和Object
的字符串表示。如何获取Class
Object
所属的文件?
我想到了这种方法,但我不知道如何实现它:
迭代Class数组,然后获取它的所有实例 然后将每个实例转换为String表示形式 检查它是否等于给定的字符串。
我遇到的问题是如何获得Instances
的所有Class
?
如果所有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
如何知道<? $form = ActiveForm::begin(
[
'options' => ['class' => 'form-horizontal'],
'fieldConfig' =>
[
'template' => '<div class="control-group">{input}</div>.<div class="control-group error">{error}</div>',
],
]);
?>
<div class="control-group">
<b>Регистрация</b>
</div>
<?
echo $form->field($model, 'login', ['template' => "{input}{error}", 'inputOptions' => array('placeHolder' => 'Логин')]);
echo $form->field($model, 'password', ['template' => "{input}{error}", 'inputOptions' => array('placeHolder' => 'Пароль')]);
echo $form->field($model, 'repassword', ['template' => "{input}{error}", 'inputOptions' => array('placeHolder' => 'Повторите пароль')]);
?>
代表哪个类?
答案 0 :(得分:3)
简短回答 - 不,这不会奏效。
toString()
方法返回对象的textual representation,但不保证会包含类名。例如,对于String
s,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());
答案 1 :(得分:1)
如前所述,我们需要知道字符串表示的含义。
在大多数应用程序(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) ;
}
}
如果给出一个String sample =&#34; Hogwart-Castle&#34 ;;您可以使用以下内容:
houseObj.toString().equals(sample);
答案 2 :(得分:0)
如果您拥有要搜索的类,则可以通过创建一个新类(我称之为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()
并确保自己确定