Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java反射-通过类名字符串获取级别_Java_Android_Reflection - Fatal编程技术网

Java反射-通过类名字符串获取级别

Java反射-通过类名字符串获取级别,java,android,reflection,Java,Android,Reflection,我一直在研究Java反射。这是维基百科的一个例子): 假设要通过反射调用活动: Activity activity; try { Class<?> clazz = Class.forName("com.test.MyLevelActivity"); activity = (Activity) clazz.newInstance(); } catch (Exception e) {

我一直在研究Java反射。这是维基百科的一个例子):

假设要通过反射调用活动:

Activity activity;
try {                
  Class<?> clazz = Class.forName("com.test.MyLevelActivity");                
  activity = (Activity) clazz.newInstance();            
} catch (Exception e) {                
  throw new IllegalStateException(e);            
}
startActivity(new Intent(this,activity.getClass()));
    Level currentLevel;
    try {                
        Class<?> clazz = Class.forName("com.test.Level_1_1");                
        currentLevel = (Level) clazz.newInstance();            
    } catch (Exception e) {                
        throw new IllegalStateException(e);            
    }

    String levelName = currentLevel.getLevelName();
    String result = Integer.toString(currentLevel.processData(3, 7));

    Toast.makeText(this, levelName + " result= " + result, Toast.LENGTH_LONG).show();
我觉得这有点违反直觉,因为该方法是在创建实例之前调用的


对不起,我不这么认为。在将方法参数传递给“invoke”之前,首先对其进行求值,因此最终将Foo类的“新”实例传递给该方法类的“invoke”方法。另外,如果您想知道为什么要对method对象调用“invoke”,那是因为对于给定的类,您只需要创建一次
方法
对象,所有后续调用都取决于对象的“状态”,而不是被调用的“方法”。

您不太清楚您的意思,但这有帮助吗

Class<?> cls = Class.forName("Foo");
Method method = cls.getMethod("hello");

Object instance = cls.newInstance();
method.invoke(instance);
Class cls=Class.forName(“Foo”);
Method=cls.getMethod(“hello”);
对象实例=cls.newInstance();
方法调用(实例);
这里

foo.hello();
无法工作,foo只是一个没有方法hello()的对象

不熟悉的东西可能看起来有悖常理,但新的习语最终会变得自然。只需按照标准方法操作即可


理解它,认为方法定义不是对象的一部分,你为类写一次方法,它独立于任何给定的对象“生存”。因此,对于类来说,说“嘿,方法,把你自己应用到这个对象的上下文中,他是我们中的一员”是非常合理的,因为你没有首先调用这个方法。您只需定义该方法,然后调用它。此外,cls的实例是在我们实际输入invoke之前创建的。我发现反射在java中是一个非常有用的API,几乎所有在java上工作的framworks(如struts、log4j等)都使用它。在反射中,您总是定义要调用的方法,然后才处理要操作的实际对象


希望这有帮助

您是否尝试过编写发布的第二段代码?它起作用了吗?它编译了吗?这个类已经定义了它的方法,当然没有hello()方法。仿制药不会改变这种情况。当然,您可以将新实例强制转换为类并调用其方法,如下所示:Foo Foo=(Foo)cls.newInstance();喂;但因此,您的代码将依赖于Foo类。在方法调用中使用反射的想法是避免这种依赖性;做也许这是我不清楚的地方?顺便说一句,我喜欢你的最后一句话!new Foo()生成一个Foo,Foo的can hello()。类foo被编译器视为更一般的东西,它没有意识到它恰好是一个foo,所以它不知道它可以是hello()。谢谢。它确实需要很多try/catch语句,并且类字符串必须是package的全名。我理解,但是每个OOP和类继承的初学者都会对您所说的感到头痛;)
    Level currentLevel;
    try {                
        Class<?> clazz = Class.forName("com.test.Level_1_1");                
        currentLevel = (Level) clazz.newInstance();            
    } catch (Exception e) {                
        throw new IllegalStateException(e);            
    }

    String levelName = currentLevel.getLevelName();
    String result = Integer.toString(currentLevel.processData(3, 7));

    Toast.makeText(this, levelName + " result= " + result, Toast.LENGTH_LONG).show();
public abstract class Level {

   public abstract String getLevelName();

   public abstract int processData(int a, int b);

}


public class Level_1_1 extends Level{
   private String levelName = "level 1.1";

   public String getLevelName(){
      return levelName;
   }

   public int processData(int a, int b) {
      return a * b;
  }
} 
Class<?> cls = Class.forName("Foo");
Method method = cls.getMethod("hello");

Object instance = cls.newInstance();
method.invoke(instance);
foo.hello();