从java中的类名实例化类

时间:2018-06-12 22:43:41

标签: java class instantiation

我尝试从类名实例化类,但是我失败了,我的代码在Processing / Java Library中。 我的第一个状态是它找到了一个好的类,我管理了但是在我发现没有可能从类名实例化之后。我需要这样做,因为我的所有方法都在我的代码中的任何地方使用,我需要在一个地方找到那些信息。 我希望我的目的很明确......

我创建此代码但是当我通过方法forName()传递名称时它失败了 控制台返回Unhandled exception type ClassNotFoundException

import java.util.Iterator;
import java.lang.reflect.*; 

Target class_a = new Target() ;
Target class_b = new Target() ;
Truc class_c = new Truc() ;


void setup() {
  class_a.is(true);
  class_b.is(false);

  Field [] f = this.getClass().getDeclaredFields();
  println("field num:",f.length);
  for(int i = 0 ; i < f.length ; i++) {
    if(f[i].getType().getName().contains("Target")) {
     println("BRAVO it's a good classes");
     println("class:",f[i].getClass());
     println("name:",f[i].getName());

     // I imagine pass the name here to instantiate the class but that's don't work
     Class<?> classType = Class.forName(f[i].getName());

     // here I try to call method of the selected class
     println(classType.get_is());
   }
 }
}



class Target{
  boolean is;
  Target() {}

  void is(boolean is) {
   this.is = is;
  }

  boolean get_is() {
    return is;
  }
}


class Truc{
  Truc() {}
}

1 个答案:

答案 0 :(得分:2)

  1. java.lang.Class对象(通过调用Class.forName得到它)没有方法get_is()。你必须使用反射来调用方法。
  2. 但是...

    1. 只要您的get_is()是非静态的,即使通过反射也无法从课堂上调用它。您必须实例化您的类,然后您才能通过反射调用所需的方法。您还可以将newInstance强制转换为所需的类,然后直接调用方法。当然,为此你必须在编译之前知道你的课程。
    2. UPD:

      你的问题在这里`Class classType = Class.forName(f [i] .getName());'

      字段名称不是它的类!。

      你必须使用它:Class<?> classType = Class.forName(f[i].getType().getName());

      此外,如果您想使用反射,则必须在get_is()

      中将Target方法声明为公开

      请查看下面的工作代码,了解选项演员和反思。 (get_is方法在Target类中是公共的)

            for(int i = 0 ; i < f.length ; i++) {
      
           // class is field type not name!
           Class<?> classType = Class.forName(f[i].getType().getName());
           // check is it Target class type
           if (f[i].getType().equals(Target.class)) {
               System.out.println("it is Target class field!");
               // option 1: cast
               Target targetFieldValue = (Target)f[i].get(this);
               System.out.println("opt1-cast -> field:" + f[i].getName() + " result: " + targetFieldValue.get_is());   
               //option 2: reflection
               Object rawValue = f[i].get(this);
               Method getIsMtd = f[i].getType().getMethod("get_is", (Class<?>[])null);
               if (null != getIsMtd)
               {
                    // invoke it
                   System.out.println("opt2 -> reflection result: " + getIsMtd.invoke(rawValue, (Object[])null));
               }   
           } 
         }