如何通过反射确定 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类的初始化/执行顺序