繁体   English   中英

Java - 调用类方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM