Java反射-通过类名字符串获取级别
我一直在研究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) {
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();