当然可以;
首先,你得获得自定义类所对应的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元注解,局部注解怎么解析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)