Hadoop 抽象方法的实现

Hadoop 抽象方法的实现,hadoop,hdfs,Hadoop,Hdfs,getFileStatus是文件系统类中的一个抽象方法,需要扩展文件系统类以使用getFileStatus方法。。 但在上面的代码中,我能够使用方法而不扩展文件系统类。 怎样当您使用文件系统类中提供的静态工厂方法获取文件系统类的实例时,我无法理解这一点。它在内部创建自己实现的一个实例。有许多可用的实现 返回此URI的方案和权限的文件系统。URI的模式决定了一个配置属性名fs.scheme.class,其值命名文件系统类。整个URI被传递给文件系统实例的initialize方法 现在,本质上,您将

getFileStatus是文件系统类中的一个抽象方法,需要扩展文件系统类以使用getFileStatus方法。。 但在上面的代码中,我能够使用方法而不扩展文件系统类。
怎样当您使用文件系统类中提供的静态工厂方法获取文件系统类的实例时,我无法理解这一点。它在内部创建自己实现的一个实例。有许多可用的实现

返回此URI的方案和权限的文件系统。URI的模式决定了一个配置属性名fs.scheme.class,其值命名文件系统类。整个URI被传递给文件系统实例的initialize方法


现在,本质上,您将调用所提供实现之一的getFileStatus方法。

但是我们如何使用getFileStatus方法而不定义它呢?您缺少Java的动态特性。实际的方法调用取决于引用的运行时。这就是所谓的多面体。看起来,您只考虑方法的静态编译时绑定,其中实际调用取决于运行时。
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class ShowFileStatus {    
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);

        Path file = new Path(args[0]);
        FileStatus stat = fs.getFileStatus(file);
        System.out.println(stat.getLen());
    }
}
public static FileSystem get(URI uri, Configuration conf) throws IOException