Java - 调用类方法

3

我正在学习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);

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


为什么不将 'obj' 强制转换为 'AppTest'? - bebeto123
1
如果您已经完全了解该类,为什么不直接使用new创建对象,而要使用反射呢? - Juned Ahsan
1
@JunedAhsan 我认为这正是他提出这个问题的原因,以确定它是否完全等效 - 是吗? - vikingsteve
Java中什么情况需要使用反射? - Dinal
@bebeto123 有很多现实世界的例子可供参考。只需尝试理解任何框架,如Hibernate/Spring等。 - Juned Ahsan
显示剩余3条评论
3个回答

2
阅读这个问题:什么是反射,为什么它有用? 它说:
“例如,假设您在Java中有一个未知类型的对象,并且如果存在一个‘doSomething’方法,则想要调用它。除非对象符合已知接口,否则Java的静态类型系统并不真正设计支持此功能,但是使用反射,您的代码可以查看对象并找出它是否有一个名为‘doSomething’的方法,然后在需要时调用它。”
您可以在这里找到一个好的教程:http://tutorials.jenkov.com/java-reflection/index.html

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的结果强制转换为它,因为...您在编译时没有它。

一个常见的折中方案是接口。如果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 实现)。

0

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

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

这将允许您调用printIt,即使它是private

但是,如果您将其转换为类对象,则无法调用私有方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接