[英]Java - Invoking class methods
我正在关注一个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);
我的问题是:如果我不知道类类型,是不是更容易(和更快)尝试转换对象而不是以这种方式调用方法?
为什么(以及何时)我应该用这种方式?
阅读此问题什么是反思,为什么它有用?
它说:
“例如,假设您在Java中有一个未知类型的对象, 并且您希望如此
如果存在,则在其上调用'doSomething'方法 。 Java的静态类型系统
除非对象符合已知对象,否则它并不是真正意义上的
接口,但使用反射,您的代码可以查看对象,并找出是否
它有一个名为'doSomething'的方法,如果你愿意,可以调用它。“
你可以在http://tutorials.jenkov.com/java-reflection/index.html找到一个好的tutotial
这样做的一个原因,不确定在你的情况下:
Method method = cls.getDeclaredMethod("printIt", noparams);
method.invoke(obj, null);
即使它是private
也允许你调用printIt
。
但是如果你转换为你的类对象,那么你将无法调用私有方法。
如果我不知道类类型,是不是更容易(和更快)尝试转换对象而不是以这种方式调用方法?
为什么(以及何时)我应该用这种方式?
我假设你的意思是“如果我知道”而不是“如果我不知道”。
如果你在编译时有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
的结果转换为它,因为...您在编译时没有它。
共同的中间立场是接口 。 如果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实现)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.