JAVA自定义注解:能否通过反射找到哪一个类加了该注解(在一个项目范围内)

JAVA自定义注解:能否通过反射找到哪一个类加了该注解(在一个项目范围内),第1张

当然可以;

首先,你得获得自定义类所对应的Class对象,

其次,通过Class对象获得所对应的所有方法,建立一个Method[] list 。

然后,遍历该Method[] list 数组,取得每一个Method对象,调用该对象的isAnnotationPresent()方法。判断该方法是否被你所标记的Annotation修饰。

最后,如果该方法返回true,自然就是那你要找的方法,否则,false。

祝你好运!!最好就是自己找到API文档,进行查阅相关类,以及相关方法的说明,自己编写代码,这样你会学会很多的,祝你成功!!!!

public static void printMethods(Class cl)\x0d\{\x0d\Method[] methods =clgetDeclaredMethods();//返回一个包含方法对象的数组\x0d\for(Method m : methods)//循环该类的每个方法\x0d\{\x0d\Class retType = mgetReturnType();//该方法的返回类型,\x0d\Sting name = mgetName();//获得方法名\x0d\Systenoutprint(" "+ModifiertoString(mgetModifiers());打印方法修饰符\x0d\Systemoutprint(" "+retTypegetName() + " " + name +"(");\x0d\\x0d\Class[] paramTypes = mgetParameterTypes();//获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)\x0d\\x0d\for(int j = 0 ; j 0 ) Systemoutprint(" , "); //如果有多个参数,中间则用逗号隔开,否则直接打印参数\x0d\Systemoutprint (paramTypes[ j ]getName);\x0d\}\x0d\Systemoutprintln (" );");\x0d\}} \x0d\\x0d\//////////getparameterTypes方法用于返回一个描述参数类型的Class对象数组)

对于局部变量的注解只能在源码级别上进行处理,类文件并不描述局部变量。因此,所有的局部变量注解在编译完一个类的时候就会被遗弃掉。同样地,对包的注解不能在源码级别之外存在。

在文件package-infojava中注解一个包,该文件只包含以注解先导的包声明

包注解需要在特定文件:package-infojava,中添加,获取如下:

Package pkg = TestAnnotationclassgetPackage();

boolean hasAnnotation=pkgisAnnotationPresent(Xpcclass);

if (hasAnnotation){

    Xpc xpc=pkggetAnnotation(Xpcclass);

    Systemoutprintln("package:" + pkggetName());

    Systemoutprintln("id=" + xpcid());

    Systemoutprintln("name=" + xpcname());

    Systemoutprintln("gid=" + xpcgid());

}

用ClassforName方法动态加载构造方法带参数的类。

1、在用ClassforName方法动态加载构造方法带参数的类时,为了将参数传递进去,可以考虑java的反射机制,比如有一个类如下:

public class Cat{

                    private int age;

                    private String name;

                    public void Cat(String name, int age){

                           thisname = name;

                           thisage = age;

                   }

        }

2、如果想用ClassforName方法动态加载这个类,可以用以下类似的代码实现:

 import javalangreflectConstructor;

        publc class LoadCat{

                    private int age;

                    private String name;

                    public void LoadCat(String name, int age){

                           super();

                           thisname = name;

                           thisage = age;

                   }

                   public static void main(String args[ ]){

                             Class clazz = ClassforName("Cat");

                             Constructor constructor = clazzgetConstructor(Stringclass, intclass);

                             LoadCat test = (LoadCat) constructornewInstance("test", 1);

                   }

        }

3、补充:

(1)反射方式调用对象类的由参构造方法!

(2)调用者与被调用者不在同包中(SpecialCalendar位于Calendar包中) 

调用者使用ClassforName()方法,应该显示的注明路径(包名) 

Class<> special = ClassforName("CalendarSpecialCalendar"); 

Constructor<> special_Calendar = 

specialgetConstructor(intclass,intclass,intclass); 

specialCalendar = (SpecialCalendar) 

special_CalendarnewInstance(2011,5,27);

4、方法二:

package comsanmao10;import javalangreflectConstructor;public class test2 {

    /

      ###2705_反射(通过反射获取带参构造方法并使用)

      Constructor

      Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数,

      就不能这样创建了,可以调用Class类的getConstructor(Stringclass,intclass)

      方法获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象/

    public static void main(String[] args) throws Exception{

        Class clazz=ClassforName("comsanmao10Person");//        Person p=(Person)clazznewInstance();    //通过无参构造创建对象//        psay();

        Constructor c=clazzgetConstructor(Stringclass,intclass);//获取有参构造

        Person p=(Person) cnewInstance("sanmao",12);    //通过有参构造创建对象

        psay();

    }

}

private static boolean validParams(Object objects) {

    for (Object obj : objects) {

        Class clz = objgetClass();

        Systemoutprintln(clz);

    }

    return false;

}

在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些 *** 作,比如像spring-mvc中,@RequestParam、@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为>

public class refP{

public static void main(String[] args)

{

Class userClass=Stringclass;//将此处换成你的class 就成了

//---- 获取所有构造方法

Constructor[] cons=userClassgetDeclaredConstructors();

Systemoutprintln("类User的构造方法包括: ");

//---- 打印出构造方法的前缀

for (int i=0;i<conslength;i++)

{

Constructor con=cons[i]; //取出第i个构造方法。

Systemoutprint(ModifiertoString(congetModifiers()));

//---- 打印该构造方法的前缀修饰符

Systemoutprint(" "+congetName()+"("); //打印该构造方法的名字

//---- 打印该构造方法的参数。

Class[] parameterTypes=congetParameterTypes(); //构造方法参数集但是 数组类型显示特殊

for(int j=0;j<parameterTypeslength;j++)

{

Systemoutprint(parameterTypes[j]getName());

}

Systemoutprintln(")");

}

}

}

/核心语句:

Class userClass=Stringclass;//找到对应的class类

Constructor[] cons=userClassgetDeclaredConstructors();//找到对应的构造器数组

Class[] parameterTypes=congetParameterTypes(); //找到每个构造器对应的参数类型数组

@Retention(RetentionPolicyRUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target({ElementTypeFIELD,ElementTypeMETHOD})//定义注解的作用目标作用范围字段、枚举的常量/方法

@Documented//说明该注解将被包含在javadoc中

public @interface FieldMeta {

/

是否为序列号

@return

/

boolean id() default false;

/

字段名称

@return

/

String name() default "";

/

是否可编辑

@return

/

boolean editable() default true;

/

以上就是关于JAVA自定义注解:能否通过反射找到哪一个类加了该注解(在一个项目范围内)全部的内容,包括:JAVA自定义注解:能否通过反射找到哪一个类加了该注解(在一个项目范围内)、java反射获得方法名后怎样判断方法是否含有参数、java元注解,局部注解怎么解析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9332445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存