我是Java的新手,但我了解基础知识。我知道接口是抽象类,它们用于模拟多重继承(有点 - 我知道在Java中这是不允许的)。我有这个代码;你能解释一下吗?
以下是迭代类列表的方法的一部分:
Constructor[] c = aClass.getConstructors();
for (Constructor constructor : c) {
if (constructor.getParameterTypes().length == 0) {
AInterface action = (AInterface) constructor.newInstance();
try {
action.run(request, response);
}
}
}
以下是上述代码使用的接口定义:
public interface AInterface
{
void run(HttpServletRequest request, HttpServletResponse response);
}
答案 0 :(得分:2)
它正在为类AClass寻找一个0参数构造函数。不会超过一个。 :)
然后使用该构造函数创建该类的实例。
然后用两个对象调用该类的“run”方法。
希望这有帮助。
答案 1 :(得分:2)
使用reflection创建一个类的实例,其java.lang.Class
对象存储在aClass
变量中,使用它的零参数构造函数(如果有的话),然后调用其中一个方法(假设它实现AInterface
)。
该代码看起来像是来自某个Web框架。你为什么看着它?反思是关于Java的更高级的事情之一,而不是初学者通常需要处理的事情。
对于调用方法运行的内容,如果方法运行没有正文?什么是好的?
创建的类(aClass
)是一个具体的类,而不是一个接口,它将实现接口并包含run
方法的主体。您需要了解有关界面的更多信息(Google是您的朋友)。
答案 2 :(得分:2)
Constructor[] c = aClass.getConstructors(); // Retrieve all the constructors
// of the class 'aClass'
for (Constructor constructor : c) { // Iterate all constructors
// Until the only default constructor is found.
if (constructor.getParameterTypes().length == 0) {
// Create a new instance of 'aClass' using the default constructor
// Hope that 'aClass' implements 'AInterface' otherwise ClassCastException ...
AInterface action = (AInterface) constructor.newInstance();
try {
// action has been cast to AInterface - so it can be used to call the run method
// defined on the AInterface interface.
action.run(request, response);
} // Oops - missing catch and/or finally. That won't compile
}
}
// Missing a bit of error handling here for the countless reflection exception
// Unless the method is declared as 'throws Exception' or similar
使用示例:
你有一个名为'TheClass'的课程
public class TheClass implements AInterface {
public void run(HttpServletRequest request, HttpServletResponse response) {
System.out.println("Hello from TheClass.run(...)");
// Implement the method ...
}
}
应用程序中的某个位置,使用Reflection或读取配置文件。 应用程序发现它应该执行'TheClass'。 你没有关于'TheClass'的任何指示,它应该实现AInterface并且它有一个默认的构造函数。
您可以使用
创建Class对象Class aClass = Class.forName("TheClass");
并在之前的代码段中使用'aClass'(在添加错误处理代码之后)。你应该在控制台中看到
Hello from TheClass.run(...)