如何通过反射确定 Java 类是不是是抽象的

Posted

技术标签:

【中文标题】如何通过反射确定 Java 类是不是是抽象的【英文标题】:How can I determine whether a Java class is abstract by reflection如何通过反射确定 Java 类是否是抽象的 【发布时间】:2010-11-07 13:22:27 【问题描述】:

我正在通过 Jar 文件中的类进行交互,并希望找到那些非抽象的。我可以通过实例化类并捕获 InstantiationException 来解决这个问题,但这会影响性能,因为某些类的启动很繁重。我在 Class.java 文档中找不到明显像 isAbstract() 的东西。

【问题讨论】:

【参考方案1】:

当您在类对象上调用 getModifiers() 时,它会将 abstract 作为其修饰符之一。

这个link 应该会有所帮助。

 Modifier.isAbstract( someClass.getModifiers() );

还有:

http://java.sun.com/javase/6/docs/api/java/lang/reflect/Modifier.html

http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getModifiers()

【讨论】:

谢谢!一个小提示:你不能使用“类”作为变量名,也许你想改变你的例子。 @seth 我认为应该是Modifier.isAbstract( someClass.class.getModifiers() ); 也许你想改变它 根据正常的 Java 命名约定,它是 someClass.getModifiers()SomeClass.class.getModifiers() 其中Class<SomeClass> someClass = SomeClass.class;【参考方案2】:
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());

【讨论】:

【参考方案3】:
public static boolean isInstantiable(Class<?> clz) 
    if(clz.isPrimitive() || Modifier.isAbstract( clz.getModifiers()) ||clz.isInterface()  || clz.isArray() || String.class.getName().equals(clz.getName()) || Integer.class.getName().equals(clz.getName()))
        return false;
    
    return true;

【讨论】:

如果它是一个接口并且类名是 java.util.List 你可能会创建 ArrayList

以上是关于如何通过反射确定 Java 类是不是是抽象的的主要内容,如果未能解决你的问题,请参考以下文章

Java面试_君哥讲解笔记_java面向对象_3抽象类和接口有什么区别接口是否可以继承接口private修饰的方法可以通过反射访问,那么private的意义是什么_ java类的初始化/执行顺序

java中如何通过反射获取类的属性

软帝学院Java反射机制!

Java反射机制

java如何通过反射获取包中所有的类?

JAVA反射总结