Saya punya Class
objek. Saya ingin menentukan apakah tipe yang Class
diwakili objek mengimplementasikan antarmuka tertentu. Saya bertanya-tanya bagaimana ini bisa dicapai?
Saya memiliki kode berikut. Pada dasarnya apa yang dilakukannya adalah mendapatkan array dari semua kelas dalam paket yang ditentukan. Saya kemudian ingin melalui array dan menambahkan objek Kelas yang mengimplementasikan antarmuka ke peta saya. Masalahnya adalah isInstance()
mengambil objek sebagai parameter. Saya tidak bisa membuat contoh antarmuka. Jadi saya agak bingung dengan ini. Ada ide?
Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
{
retVal.put(clazz.getSimpleName(), clazz);
}
}
java
reflection
pengguna489041
sumber
sumber
Class
instance tersebut tidak akan kompatibel. Anda bisa melihat kesalahan sepertijava.lang.ClassCastException: com.my.CustomClass cannot be cast to com.my.CustomClass
atau sesuatu yang tidak bisa dijelaskan.myClassLoader = new URLClassLoader(new URL[] { candidateFile.toURI().toURL() }, LoadedPlugin.class.getClassLoader());
andclassToLoad = Class.forName("com.blablabla.plugin.Main", true, myClassLoader);
andinstance = (MyIntf) classToLoad.newInstance();
Works like a charm.Anda dapat menggunakan fungsi di bawah ini untuk mendapatkan semua antarmuka yang diimplementasikan
sumber
Anda dapat menggunakan
class.getInterfaces()
dan kemudian memeriksa untuk melihat apakah kelas antarmuka ada di sana.Class someInterface; // the interface you want to check for Class x; // Class[] interfaces = x.getInterfaces(); for (Class i : interfaces) { if (i.toString().equals(someInterface.toString()) { // if this is true, the class implements the interface you're looking for } }
sumber
isAssignableFrom
seperti yang disebutkan Flavio.isAssignableFrom
mungkin lebih disukai, mungkin ada contoh di mana Anda perlu memindai daftar antarmuka yang diimplementasikan kelas dengan melihat namanya.Anda juga dapat menyetel instance dengan menambahkan ".class"
Class[] classes = ClassUtils.getClasses(handlersPackage); for(Class clazz : classes) { if(Interface.class.isAssignableFrom(clazz)) { retVal.put(clazz.getSimpleName(), clazz); } }
sumber
ClassUtils
bukan bagian dari Java (ada di Guava atau Spring dan framework lain), istilah yangInterface
digunakan di atas dimaksudkan untuk merujuk ke antarmuka tertentu yang sedang diuji ( yaitu, ini bukan kata kunci Java dalam konteks ini), dan tujuan dariretVal
tidak dijelaskan atau disebutkan di mana pun.