`

Class的isAssignableFrom的用法

 
阅读更多
instanceof 针对实例
isAssignableFrom针对class对象


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

通常调用格式是 

Class1.isAssignableFrom(Class2)   


调用者和参数都是   java.lang.Class   类型。

而   instanceof   是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。  
    格式是:  

oo   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("收电费");  
  
    }  
  
}  


参考:http://blog.csdn.net/kjfcpua/article/details/7045207

    http://www.yiibai.com/java/lang/class_isassignablefrom.html

   http://www.iteye.com/problems/32021
分享到:
评论

相关推荐

    isAssignableFrom

    也就是说,如果A类是B类的父类(或者A接口是B接口的扩展),那么Class对象表示A的`isAssignableFrom`方法调用表示B的Class对象时会返回true。这是一个非常基础但关键的概念,尤其在多态和泛型中应用广泛。 在描述中...

    Java中isAssignableFrom的用法详解

    在Java编程语言中,`Class` 类提供了一个非常有用的方法 `isAssignableFrom()`. 这个方法主要用于判断一个类或接口是否可以被赋值给另一个类或接口,即判断前者是否是后者的超类或超接口。这个功能在泛型、反射以及...

    java判断class子类或父类的实例方法

    判断一个类是否为另一个类的子类或父类可以使用 Class 对象的 isAssignableFrom() 方法,该方法返回一个布尔值,表示该类是否为另一个类的子类或父类。 在 Java 中,我们可以使用反射机制来获取类中的成员变量、...

    判断类的缓存大小

    `isAssignableFrom(Class&lt;?&gt; cls)`方法同样是`Class`类中的一个方法,用于判断当前类或接口是否可以被赋予由`cls`参数指定的类型。如果当前类可以赋值给`cls`类型的变量,则返回`true`;否则返回`false`。其用法如下...

    反射简单示例

    反射还可以用于检查类是否实现了特定接口或继承自特定父类,使用`isAssignableFrom()`方法。例如: ```java if (String.class.isAssignableFrom(clazz)) { System.out.println("Class is a string-like."); } ``` ...

    Java Reflection(JAVA反射)详解

    1. 使用`Class.forName(String className)`方法,传入类的全限定名(包括包名)来获取对应的`Class`对象。 ```java Class&lt;?&gt; c = Class.forName("java.lang.String"); ``` 2. 直接使用类名或基本类型的`.class`...

    java代码-Class类

    - 使用`Class.forName(String className)`静态方法,传入类的全限定名(包括包名)。 - 对象的`getClass()`方法,例如:`MyClass obj = new MyClass(); Class&lt;?&gt; c = obj.getClass();` - 类的`class`关键字,例如...

    java反射深入剖析(推荐)

    1. 使用`Class.forName("类全名")`,此方法需要提供类的完全限定名(包括包名),并可能抛出`ClassNotFoundException`。 2. 调用对象的`getClass()`方法,如`new Demo().getClass()`,这会返回该对象所属类的`Class`...

    C#中实现判断某个类是否实现了某个接口

    简单来说,可以使用Type.IsAssignableFrom方法: typeof(IFoo).IsAssignableFrom(bar.GetType()); typeof(IFoo).IsAssignableFrom(typeof(BarClass)); 从字面意思可以看出,IsAssignableFrom表示BarClass类型能否...

    扫描接口实现类

    3. **接口扫描**:为了找到实现特定接口的所有类,我们需要遍历类路径,加载每个类,并使用`Class.isAssignableFrom(Class&lt;?&gt; clazz)`检查该类是否实现了目标接口。`getInterfaces()`方法可以获取类实现的所有接口。...

    Java反射案例

    使用`Class.newInstance()`方法可以无参构造函数创建对象,但如果有参数的构造函数,需要通过`Constructor`类的`getDeclaredConstructor()`或`getConstructor()`方法获取构造器,然后调用`newInstance()`创建对象。...

    ReflectDemo.rar

    - `isAssignableFrom(Class&lt;?&gt; clazz)`判断是否可以从一个类派生出另一个类。 - `isInterface()`判断是否为接口。 - `isPrimitive()`判断是否为基本类型。 - `getModifiers()`获取方法或字段的修饰符。 6. 枚举...

    反射源代码,源代码,源代码,源代码

    `Class`对象提供了`getInterfaces()`和`isAssignableFrom()`方法,用于检查类是否实现特定接口或是否可以赋值给某个类。同时,可以使用`getAnnotations()`和`isAnnotationPresent()`来获取和检查类、方法或字段上的...

    反射的核心代码

    1. 使用`Class.forName()`方法,传入完全限定类名,例如`Class.forName("java.lang.String")`。 2. 对象的`getClass()`方法,如`String str = "Hello"; Class&lt;?&gt; clazz = str.getClass();`。 3. 类的`class`关键字,...

    Java反射入门

    - `isAssignableFrom(Class&lt;?&gt; c)`: 检查当前Class对象是否可以被指定的Class对象赋值。 4. **创建对象**: - `newInstance()`: 如果类有无参构造器,可以使用此方法创建类的对象。 - `Constructor&lt;?&gt; get...

    java反射调用实例代码

    - 获取接口实现:`boolean isAssignableFrom(Class&lt;?&gt; clazz2)`判断类是否能被转换为`clazz2`类型。 - 实现序列化与反序列化:`ObjectInputStream`和`ObjectOutputStream`可以通过`readObject()`和`writeObject()`...

    反射取继承子类.rar

    但我们可以自定义解决方案,通过遍历所有已加载的类,并检查它们是否通过`isAssignableFrom()`方法表明它们是目标类的子类。以下是一个简单的示例: ```java public List&lt;Class&lt;?&gt;&gt; getAllSubclasses(Class&lt;?&gt; ...

    java教程ppt,讲述了java reflect.,对大家应该很有帮助

    5. **接口和泛型处理**:反射同样适用于接口,可以检查类是否实现了特定接口,通过`isAssignableFrom(Class&lt;?&gt; c)`判断。对于泛型,虽然运行时擦除,但可以通过方法签名获取到泛型信息。 6. **异常处理**:反射操作...

    Java 1.5 反射机制

    反射机制也可以用来检查类是否实现了特定接口,通过`Class`对象的`isAssignableFrom()`方法,可以判断一个类是否可以从另一个类或接口进行赋值。 6. 泛型处理 尽管Java的泛型在编译时被擦除,但反射仍然提供了对...

Global site tag (gtag.js) - Google Analytics