Java 检查派生类是否具有来自超类的注释
我需要检查,form super类,如果派生类有特定的注释:Java 检查派生类是否具有来自超类的注释,java,oop,inheritance,annotations,Java,Oop,Inheritance,Annotations,我需要检查,form super类,如果派生类有特定的注释: public class SuperClass { public boolean hasAnnotation() { //super_class_method_code } } @annotationToCheck public class DerivedClass extends SuperClass { //derived_class_code } 这在Java中是可能的吗?我知道如何使用C语言,但在
public class SuperClass
{
public boolean hasAnnotation()
{
//super_class_method_code
}
}
@annotationToCheck
public class DerivedClass extends SuperClass
{
//derived_class_code
}
这在Java中是可能的吗?我知道如何使用C语言,但在Java中我找不到任何解决方案…:(
谢谢!!!如果您的实例实际上是子类类型,那么这就像在超类型中定义方法一样简单,以实现以下功能:
this.getClass().isAnnotationPresent(annotationToCheck.class);
由于this
是DerivedClass的一个实例,因此getClass返回DerivedClass并进行检查
注2:正如@Pshemo在注释中提到的,只有当注释使用
@Retention(RetentionPolicy.RUNTIME)
进行注释时,这才有效。如果您的实例实际上是子类类型,那么这就像在超类型中定义方法一样简单,以实现以下功能:
this.getClass().isAnnotationPresent(annotationToCheck.class);
由于this
是DerivedClass的一个实例,因此getClass返回DerivedClass并进行检查
注2:正如@Pshemo在注释中提到的,这仅在注释使用
@Retention(RetentionPolicy.RUNTIME)
另一种使用project获取派生类的方法进行注释时有效。此项目具有依赖项(slf4j、log4j和javassist等)
注意:派生类应仅在提到的包中
import java.util.Set;
import org.reflections.Reflections;
public class Base {
public Base() {
Reflections reflections = new Reflections("com.sree.despacerivedclasskage");
Set<Class<? extends Base>> classes = reflections
.getSubTypesOf(Base.class);
System.out.println(classes);
for(Class clazz: classes){
System.out.println(clazz.isAnnotationPresent(ToCheck.class));
}
}
public static void main(String[] args) {
Base b = new Base();
}
}
import java.util.Set;
导入org.reflections.reflections;
公共阶级基础{
公共基地(){
反射=新反射(“com.sree.despacerivedclasskage”);
设置使用project获取派生类的另一种方法。此项目具有依赖项(slf4j、log4j和javassist等)
注意:派生类应仅在提到的包中
import java.util.Set;
import org.reflections.Reflections;
public class Base {
public Base() {
Reflections reflections = new Reflections("com.sree.despacerivedclasskage");
Set<Class<? extends Base>> classes = reflections
.getSubTypesOf(Base.class);
System.out.println(classes);
for(Class clazz: classes){
System.out.println(clazz.isAnnotationPresent(ToCheck.class));
}
}
public static void main(String[] args) {
Base b = new Base();
}
}
import java.util.Set;
导入org.reflections.reflections;
公共阶级基础{
公共基地(){
反射=新反射(“com.sree.despacerivedclasskage”);
设置这是C中的解决方案:[may this help][1][1]:另一个在运行时这是C中的解决方案:[may this help][1][1]:另一个在运行时+1我只想补充一点,这适用于带有@Retention(RetentionPolicy.runtime)
policy.Ohhhhh!!!!我忘了指定@Retention(value=RetentionPolicy.runtime)和@Target(value=ElementType.TYPE)在我的注释中!!!谢谢你的Hiery和Pshemo!!!@Pshemo很好的观察!谢谢你添加了这一点。请随时用此信息更新你的答案,或者更新我的评论,使其更可见(对于那些-像我一样开始时-不知道为什么它不适用于他们的人:)@HieryNomus我删除了()从OP问题中的类声明来看,注释1现在毫无意义(对不起;p)+1我只想补充一点,这适用于带有@Retention(RetentionPolicy.RUNTIME)
policy.ohhhh!!!!我忘了指定@Retention(value=RetentionPolicy.RUNTIME)和@Target(value=ElementType.TYPE)的注释在我的注释中!!!谢谢你Hiery和Pshemo!!!@Pshemo很好的观察!谢谢你添加这一点。请随时用此信息更新你的答案,或者更新我的评论,使其更可见(对于那些一开始就喜欢我的人,他们想知道为什么它对他们不起作用:)@HieryNomus我删除了()从OP问题中的类声明中,所以注释1现在是毫无意义的(抱歉;p)