GVKun编程网logo

为什么套接字在运行时不是instanceof Closeable?(为什么使用套接字)

25

这篇文章主要围绕为什么套接字在运行时不是instanceofCloseable?和为什么使用套接字展开,旨在为您提供一份详细的参考资料。我们将全面介绍为什么套接字在运行时不是instanceofClo

这篇文章主要围绕为什么套接字在运行时不是instanceof Closeable?为什么使用套接字展开,旨在为您提供一份详细的参考资料。我们将全面介绍为什么套接字在运行时不是instanceof Closeable?的优缺点,解答为什么使用套接字的相关问题,同时也会为您带来Class.isAssignableFrom 与 instanceof 区别、close套接字后为什么系统不立即重新分配相同值的套接字、instanceof 与 isAssignableFrom、instanceof 与isAssignableFrom的实用方法。

本文目录一览:

为什么套接字在运行时不是instanceof Closeable?(为什么使用套接字)

为什么套接字在运行时不是instanceof Closeable?(为什么使用套接字)

在一个Android应用中,我将此代码添加到 onCreate()

    Closeable sss = new Socket();    if (!(sss instanceof Closeable)) {        throw new RuntimeException("Something unexpected happened");    }

进口是:

import java.io.Closeable;import java.net.Socket;

代码可以编译,但是出现异常:

E/AndroidRuntime( 8293): java.lang.RuntimeException: Unable to start activity...: java.lang.RuntimeException: Something unexpected happened...E/AndroidRuntime( 8293): Caused by: java.lang.RuntimeException: Something unexpected happened...

在不同的上下文中,故障会导致java.lang.ArrayStoreException(即
_java.lang.ArrayStoreException:java.net.Socket无法存储在类型为java.io.Closeable
[]的数组中_ )。

我想念什么吗?知道该怎么办吗?

编辑 类似,当DatagramSocket按原样MyClass<DatagramSocket>使用时MyClass<T extendsCloseable>,它会导致 java.lang.IncompatibleClassChangeError:接口未实现

答案1

小编典典

在19之前的Android API级别上会发生此问题。在受影响的版本上,Socket不实现Closeable。

资料来源:

  • Android:与Socket一起使用Closeable接口的异常
  • https://code.google.com/p/android/issues/detail?id=62909

Class.isAssignableFrom 与 instanceof 区别

Class.isAssignableFrom 与 instanceof 区别

isAssignableFrom
‘Class.isAssignableFrom’方法是用来判断一个类 Class1 和另一个类 Class2 是否相同或 Class1 是 Class2 的超类或接口。 
通常调用格式是: 
Class1.isAssignableFrom (Class2) 
调用者和参数都是 java.lang.Class 类型。

instanceof
而 instanceof 运算符是用来判断一个对象实例是否是一个类或接口的实例。 
格式是:obj instanceof TypeName 
第一个参数是对象实例名,第二个参数是具体的类名或接口名。 
Class.isInstance (Object obj) 与 instanceof 等价。

Java 里,引用的类型是静态确定的 —— 源码里声明是什么类型就是什么类型;而对象的实际类型是动态确定的。 
instanceof 运算符它的运行时语义并不关心它的左操作数的引用的静态类型,而只关心它所引用的对象的实际类型是否跟右操作数所指定的类型相匹配。

instanceof 是如何进行判断的?

At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast to the ReferenceType without raising a ClassCastException. Otherwise the result is false.

也就是说,对于 obj instanceof TypeName 
如果 obj 可以转换为 TypeName 类型(没有抛出 ClassCastException 异常)则返回 true,否则返回 false。

区别
instanceof 是 Java 语言的语法结构,而该语法要求 instanceof 运算符的右操作数是一个引用类型名,也就意味着右操作数必须是一个编译时的常量
isInstance 是 Java 标准库里的一个方法,其被调用对象(receiver object,也就是 “this”)等价于 instanceof 运算符的右操作数的意义,但可以是运行时决定的任意 java.lang.Class 对象,而不要求是编译时常量。这就比 instanceof 运算符要灵活一些。
import org.junit.Test;

class Person {
    private String name;
    private int age;

    public Person() {
        name = "lgh";
        age = 25;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(int age, String name) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name=''" + name + ''\'''' +
                ", age=" + age +
                ''}'';
    }
}

public class T {
    @Test
    public void test()  {
        Person person1 = new Person("111", 24);
        Person person2 = new Person("222", 25);
        System.out.println(person1.getClass().isAssignableFrom(person2.getClass()));//true
        System.out.println(Object.class.isAssignableFrom(person1.getClass()));//true
        System.out.println(person1.getClass().isAssignableFrom(Object.class));//false

        System.out.println(person1 instanceof Person);//true
        System.out.println(person1 instanceof Object);//true
    }
}

close套接字后为什么系统不立即重新分配相同值的套接字

close套接字后为什么系统不立即重新分配相同值的套接字

如题,我使用线程池+epoll做了一个服务器端。
    客户请求连接,accept返回一个套接字值为13,加入epoll监听,客户请求到来epoll返回事件,服务器处理完后将结果写入套接字13,线程继 续等待请求到来。直到当客户请求下线后服务器端调用close关闭套接字13,服务器继续等待。接着第二个客户链接到来时,accept返回一个套接字值 为14,然后如上继续处理返回,最后调用close关闭。然后不断重复,套接字值不断自增1!试验环境都是同时只有一个客户端连接服务器的。
    问题就是为什么系统没有立即重用刚关闭的套接字,而如果没有客户端连接的情况下,让服务器端静止1分钟左右,在让客户端发起一个连接,这时返回的套接字值是13,然后如果继续前述的操作结果也是套接字值自增。
    但是,
    我在另一个试验中使用只使用线程池没有使用epoll,当我使用一个客户端不断发起一个连接请求,服务器端处理后返回给客户端,然后服务器关闭该连接,客户端接着发起连接。此时系统却可以
很快的马上使用刚关闭的套接字(从套接字的值来看,即值相等的套接字)。不会出现不断自增的情况。

    这是为什么呢?如何避免显式关闭套接字后accept返回的套接字值自增,而不是重新利用刚关闭的套接字?

instanceof 与 isAssignableFrom

instanceof 与 isAssignableFrom

instanceof 针对实例 
isAssignableFrom 针对 class 对象

 

isAssignableFrom   是用来判断一个类 Class1 和另一个类 Class2 是否相同或是另一个类的超类或接口。   
通常调用格式是  

Class1.isAssignableFrom(Class2)     

调用者和参数都是   Java.lang.Class   类型。   
      
  而   instanceof   是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。   
    格式是:   

instanceof   TypeName       

第一个参数是对象实例名,第二个参数是具体的类名或接口名,例如   String,InputStream。

public class Test {  
    public static void main(String[] args) {  
        List<String> list = new ArrayList<String>();  
        System.out.println(list instanceof List);  
        System.out.println(list instanceof ArrayList);  
          
/*      System.out.println(list.getClass()); 
        System.out.println(List.class); 
        System.out.println(ArrayList.class);*/  
          
        System.out.println(list.getClass().isAssignableFrom(List.class));  
        System.out.println(List.class.isAssignableFrom(list.getClass()));  
    }  
}  

结果:

true
true
false
true

其中 instanceof 是子 --> 父 
isAssignableFrom 是父 --> 子

 

 

我们应该尽量少用 instanceof 运算符

应该尽量用多态来替代它

public interface Accounts {     
  
}  
  
public class WaterAccounts implements Accounts {  
      
}  
  
public class ElectricityAccounts implements Accounts {   
      
}  
//客户端    
public class test {  
  
    public static void main(String[] args) {  
  
        Accounts accsWater = new WaterAccounts();  
        Accounts accsElectricity = new ElectricityAccounts();  
  
        acceptAcounts(accsWater);  
  
    }  
  
    // 第一种使用instanceof  
    public static void acceptAcounts(Accounts accs) {  
  
        if (accs instanceof WaterAccounts) {  
  
            System.out.println("收水费");  
  
        } else if (accs instanceof ElectricityAccounts) {  
  
            System.out.println("收电费");  
        }  
  
    }  
  
    // 第二种使用多态  
    public static void acceptAcounts(WaterAccounts accs) {  
  
        System.out.println("收水费");  
  
    }  
  
    public static void acceptAcounts(ElectricityAccounts accs) {  
  
        System.out.println("收电费");  
  
    }  
  
}  

 

instanceof 与isAssignableFrom

instanceof 与isAssignableFrom

instanceof 针对实例 
isAssignableFrom针对class对象

 

isAssignableFrom   是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。   
通常调用格式是  

Java代码  收藏代码

  1. Class1.isAssignableFrom(Class2)     

 

调用者和参数都是   Java.lang.Class   类型。   
      
  而   instanceof   是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。   
    格式是:   

Java代码  收藏代码

  1. oo   instanceof   TypeName       

     第一个参数是对象实例名,第二个参数是具体的类名或接口名,例如   String,InputStream。

 

Java代码  收藏代码

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         List<String> list = new ArrayList<String>();  
  4.         System.out.println(list instanceof List);  
  5.         System.out.println(list instanceof ArrayList);  
  6.           
  7. /*      System.out.println(list.getClass()); 
  8.         System.out.println(List.class); 
  9.         System.out.println(ArrayList.class);*/  
  10.           
  11.         System.out.println(list.getClass().isAssignableFrom(List.class));  
  12.         System.out.println(List.class.isAssignableFrom(list.getClass()));  
  13.     }  
  14. }  

 

结果:

true
true
false
true

其中instanceof是子-->父 
isAssignableFrom是父-->子

 

 

我们应该尽量少用instanceof 运算符

应该尽量用多态来替代它

 

Java代码  收藏代码

  1. public interface Accounts {     
  2.   
  3. }  
  4.   
  5. public class WaterAccounts implements Accounts {  
  6.       
  7. }  
  8.   
  9. public class ElectricityAccounts implements Accounts {   
  10.       
  11. }  

 

Java代码  收藏代码

  1. //客户端    
  2. public class test {  
  3.   
  4.     public static void main(String[] args) {  
  5.   
  6.         Accounts accsWater = new WaterAccounts();  
  7.         Accounts accsElectricity = new ElectricityAccounts();  
  8.   
  9.         acceptAcounts(accsWater);  
  10.   
  11.     }  
  12.   
  13.     // 第一种使用instanceof  
  14.     public static void acceptAcounts(Accounts accs) {  
  15.   
  16.         if (accs instanceof WaterAccounts) {  
  17.   
  18.             System.out.println("收水费");  
  19.   
  20.         } else if (accs instanceof ElectricityAccounts) {  
  21.   
  22.             System.out.println("收电费");  
  23.         }  
  24.   
  25.     }  
  26.   
  27.     // 第二种使用多态  
  28.     public static void acceptAcounts(WaterAccounts accs) {  
  29.   
  30.         System.out.println("收水费");  
  31.   
  32.     }  
  33.   
  34.     public static void acceptAcounts(ElectricityAccounts accs) {  
  35.   
  36.         System.out.println("收电费");  
  37.   
  38.     }  
  39.   
  40. }  

关于为什么套接字在运行时不是instanceof Closeable?为什么使用套接字的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Class.isAssignableFrom 与 instanceof 区别、close套接字后为什么系统不立即重新分配相同值的套接字、instanceof 与 isAssignableFrom、instanceof 与isAssignableFrom等相关内容,可以在本站寻找。

本文标签: