Java - 调用类方法

时间:2014-06-18 07:19:03

标签: java

我正在关注一个java教程,我找到了这段代码:

//load the AppTest at runtime
Class cls = Class.forName("com.mkyong.reflection.AppTest");
Object obj = cls.newInstance();

//call the printIt method
Method method = cls.getDeclaredMethod("printIt", noparams);
method.invoke(obj, null);

我的问题是:如果我不知道类的类型,是不是更容易(和更快)尝试转换对象而不是以这种方式调用方法?
为什么(以及何时)我应该这样使用?

3 个答案:

答案 0 :(得分:2)

阅读这个问题 What is reflection and why is it useful?

它说:

“例如,假设您在Java中有一个未知类型的对象,并且您希望使用 如果存在,则在其上调用'doSomething'方法。 Java的静态打字系统
除非对象符合已知的对象,否则它并不是真正意义上的 接口,但使用反射,您的代码可以查看对象,并找出是否
它有一个名为'doSomething'的方法,然后如果你想要调用它。“

你可以在http://tutorials.jenkov.com/java-reflection/index.html

找到一个好的tutotial

答案 1 :(得分:0)

这样做的一个原因,不确定是否在你的情况下:

Method method = cls.getDeclaredMethod("printIt", noparams);
method.invoke(obj, null);
即使是printIt

也允许您拨打private

但是如果你转换为你的类对象,那么你将无法调用私有方法。

答案 2 :(得分:0)

  

如果我不知道类的类型,那么尝试转换对象而不是以这种方式调用方法并不容易(并且更快)?

     

为什么(以及何时)我应该这样使用?

我认为你的意思是"如果我知道"不是"如果我不知道"上方。

如果您在编译时有com.mkyong.reflection.AppTest,那么您根本不需要使用反射来使用它。只需使用它:

// In your imports section (although you don't *have* to do this,
// it's normal practice to avoid typing com.mkyong.reflection.AppTest
// everywhere you use it)
import com.mkyong.reflection.AppTest;

// ...and then later in a method...

//load the AppTest at runtime
AppTest obj = new AppTest();

//call the printIt method
obj.printIt();

如果您在编译时 不知道该课程,则无法将newInstance的结果投射到该课程上,因为......您不会&# 39;在编译时有它。

常见的中间立场是接口。如果com.mkyong.reflection.AppTest实现了一个界面(比如TheInterface),那么你可以这样做:

//load the AppTest at runtime
Class cls = Class.forName("com.mkyong.reflection.AppTest");
TheInterface obj = (TheInterface)cls.newInstance();

//call the printIt method
obj.printIt();

在编译时,您只需要接口,而不是实现类。您可以在运行时加载实现类。这是插件的一种相当常见的模式(比如说,JDBC实现)。