在JAVA-Anomaly中动态加载类

时间:2010-10-25 06:19:02

标签: java dynamic classloader instanceof

球员,    Java Dynamic类加载有一个稍微不同的问题。我必须将一个对象(比如A类的Object A1)传递给B类的另一个对象B1的构造函数,这样A1的细节就存储在B1中。 B1不知道它接收的是什么类型的对象。所有它知道的是A1是一个对象。

现在我在B类中有函数,它接受对象C1并检查它是否等于Object A1。所以基本上我必须检查

  1. 如果对象C1也属于A类。(实际上我没有超过这一点。)
  2. 如果对象内的值相同
  3. 我尝试了一个解决方案:

    当在B1中存储对象A1时,我还存储类“A”的名称,因为对象B1只获取对象A1而不是类名A.

    
    public static void testing(Object C1, String s) //testing is the function of B called by B1
      {
          try{
              Class c = Class.forName(s);
    
              if( C1 instanceof c) // This is throwing error stating c cannot be resolved to a type
              {
                  //further checking
              }
    
    
          }catch (Exception e){ System.out.println(e);}
      }
    

    我一直在尝试使用不同的代码来获取类类型以进行instanceof()比较,但我没有成功。有什么建议吗?

    我甚至试过这个但同样的错误

    
    ClassLoader classLoader = B.class.getClassLoader();
    
          try{
              Class class11 = classLoader.loadClass(s);
              if ( C1 instanceof class11 )
              {
    
              }
              }catch (Exception e){ System.out.println(e);}
    

    关于如何继续的任何指针都会非常有用!

    解决方案是使用:isInstance而不是instanceof

    此问题还存在其他问题。让我用以下评论更新它。我现在必须比较C1和A1中的一个值,比如说AGE,它在B1里面。现在我该怎么做?如果我尝试函数或值,我会给我编译错误,因为编译器仍然忘记了对象C1和A1的类类型

    此外,我可以首先保存X1而不是A1。现在我可能需要检查像ADDRESS这样的不同属性检查。这大大改变了问题的维度。

3 个答案:

答案 0 :(得分:4)

instanceof运算符仅适用于静态加载的类。对于动态加载的类,请使用isInstance类上的Class方法。

if (class11.isInstance(C1)) {
    // do something
}

答案 1 :(得分:2)

使用Class.isInstance()代替instanceof运算符:

if (c.isInstance(C1)) {
    [...]
}

注意:

  • instanceof运算符只能用于类型(在编译时已知)。
  • isInstance()个对象上调用java.lang.Class方法。

答案 2 :(得分:1)

instanceof cunstruction需要type,而不是类对象的引用:

if ( C1 instanceof MyClass ) {
  // ...
}

您可以使用:

if (c.isnstance(C1)) {
  // ...
}