2013-02-04 398 views
3

我是Reflection的新手。我看過一些問題和教程。實例化使用反射實現特定接口的Java類

假設我有一個接口,其真實由3 類A,B實施,C

public interface MyInterface { 
doJob(); 

}

現在使用反射我想要調用每個類

Class<?> processor = Class.forName("com.foo.A"); 
Object myclass = processor.newInstance(); 

不能創建一個對象,我不能將整個過程限制爲特定的類型。 我只想調用MyInterface類型的類。

如果我傳遞com.foo.A它應該創建一個類對象,com.foo.B應該做B類Object,但是如果我傳遞一些com.foo.D存在但仍然不實現MyInterface shouldn不會被調用。

我該如何做到這一點?

+1

檢查此鏈接...... http://stackoverflow.com/questions/492184/how-do-you-fi ND-所有亞類對的一給出的級合的java – sunleo

回答

6

嘗試

MyInterface newInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
    Class<?> cls = Class.forName(className); 
    if (!MyInterface.class.isAssignableFrom(cls)) { 
     throw new IllegalArgumentException(); 
    } 
    return (MyInterface) cls.newInstance(); 
} 
2

那麼,Java反射是一個通用的機制,所以如果你只使用你在問題中提供的代碼,是沒有辦法達到你想達到的目標。 就像詢問如何限制Java創建其他類型的對象比實現'MyInterface'的類型。 Java的'新'是通用的,它將允許創建你想要的任何對象。

一般而言,您可以爲此編寫自己的代碼。 而不是調用直接

Class.forName 

打電話給你自己的代碼

您可以實現類似的東西在編譯時間/運行時間。

舉例編譯類型檢查(你需要創建一個類對象):

public T newInstance(Class<T extends MyInterface cl) { 
    return cl.newInstance(); 
} 

的運行實例被張貼葉夫根尼·Dorofeev已經

希望這有助於

0

試試下面的代碼

package com.rais.test; 

public class Client { 

    public static void main(String[] args) { 
     try { 
      System.out.println(createObject("com.rais.test.A")); 
      System.out.println(createObject("com.rais.test.D")); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

public static MyInterface createObject(String className) 
     throws ClassNotFoundException, InstantiationException, 
     IllegalAccessException { 

    Class<?> clazz = Class.forName(className); 

    if (MyInterface.class.isAssignableFrom(clazz)) { 
     return (MyInterface) clazz.newInstance(); 

    } else { 

     throw new RuntimeException(
       "Invalid class: class should be child of MyInterface"); 
    } 

}