我正在关注一个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);
我的问题是:如果我不知道类的类型,是不是更容易(和更快)尝试转换对象而不是以这种方式调用方法?
为什么(以及何时)我应该这样使用?
答案 0 :(得分:2)
阅读这个问题 What is reflection and why is it useful?
它说:
“例如,假设您在Java中有一个未知类型的对象,并且您希望使用
如果存在,则在其上调用'doSomething'方法。 Java的静态打字系统
除非对象符合已知的对象,否则它并不是真正意义上的
接口,但使用反射,您的代码可以查看对象,并找出是否
它有一个名为'doSomething'的方法,然后如果你想要调用它。“
答案 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实现)。