java反射以及自定义注解二者的使用

原创 2015年07月09日 12:19:57

使用Java的反射机制,可以在运行时,动态地获取一个类的成员以及方法的信息。之前也看了一段时间,有点理解,今天来和新手们分享一下。有不对的地方请指出


那么注解和反射如何搭配使用呢?那么这里又要说明注解。大家可以在别的地方看到许多注解的资料,我就不写太多废话,我把我使用时一些容易错的地方再强调一下,

这里是我写好的一个demo,SelfDefinitionAnnotation 就是咱们自定义的一注解注解,那么来看看自定义注解的代码

package com.AnnotationDemo.test;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SelfDefinitionAnnotation
{
int id();
}
}

可以看到,@target这个注解的意思是,咱们自定义注解在后面的使用范围,这里的filed是类成员,method自然是类的方法,这里要强调的是,类成员必须是Public类型的

,@Retention是说明注解的作用范围,这里的参数表明此注解运行时起作用,很重要,记得写上。

接下来我们看到了@interface这里是对注解的声明,注解内部可以声明注解的内容,格式为:类型  名称();可以加入defalut来设置默认值,这些点有许多资源大家都可以找到。注解的声明看完了,我们来看看它的使用,这里我们建一个新类AnnotationTest,来使用我们自定义的注解这个类的声明如下

package com.AnnotationDemo.test;


import java.lang.reflect.Field;
import java.lang.reflect.Method;




public class AnnotationTest
{
@SelfDefinitionAnnotation(id =(int) 2)
public  int a;
public AnnotationTest()
{
this.a=0;
}
@SelfDefinitionAnnotation(id=(int) 1)
public int getA()
{
return a;
}


}

我们可以看到,我们给这个类的成员a上打上了注释,id是2(这里的a在java可以称为字段,后面会用field来调用a),还给getA方法打上了一个注解,id为1(这个getA方法一会我们会用Method方法来反射使用),接下来看一下我们的测试类,对注解以及反射进行测试。

public class Test
{
public static void main(String[] args) throws NoSuchMethodException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
AnnotationTest annotationTest = new AnnotationTest();
Class<? extends AnnotationTest> ClassType = annotationTest.getClass();
Method method = ClassType.getMethod("getA");
SelfDefinitionAnnotation selfDefinitionAnnotation = method.getAnnotation(SelfDefinitionAnnotation.class);
if(selfDefinitionAnnotation.id() == 1)
{
int a = (int) method.invoke(annotationTest);
System.out.println(a);
}
System.out.println(selfDefinitionAnnotation.id());


Field field = annotationTest.getClass().getField("a");

SelfDefinitionAnnotation selfDefinitionAnnotation2 = field.getAnnotation(SelfDefinitionAnnotation.class);
if(selfDefinitionAnnotation2.id() == 2)
System.out.println((int)field.get(annotationTest));


}
}

这里我们可以看到,使用了Method和Field这两个类,用来遍历AnnotationTest这个类的方法和成员变量,如上图的Method method = ClassType.getMethod("getA");和Field field = annotationTest.getClass().getField("a");,但是在使用反射之前,必须要做到的第一点就是:

获取被反射类的class对象,而获得这个对象有三种方法:

1.类名.class

2.类实例对象.getClass()

3.class.forName()方法

上面的getMethod和getField方法大家自己去查看java的API文档,注意,这里可以反射的filed成员必须是public声明的,否则无法反射到。invoke这个函数可能有点复杂,大家看API或者在搜索一些与这个方法相关的资料。我写的是只能反射特定方法的语句,Java中也有Method methods[]=classtype。getmethods;方法。大家可以自己动手查API,有不对或者说得不清楚的地方请大家指出。

版权声明:转载请注明出处,谢谢!有不对的地方请指出

相关文章推荐

使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句

使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句 这次给大家介绍一下在Java开发过程中 使用自定义注解开发: 主要知识点...

Java自定义注解实例

  • 2017年11月03日 17:24
  • 2KB
  • 下载

java利用反射机制获取实体类属性自定义注解说明

最近做项目,需要利用java反射机制,获取实体类自定义注解的说明信息 1.自定义注解 package com.bjhy.platform.criminal.search.core.annotati...

java 自定义注解验证

  • 2017年02月23日 10:36
  • 21KB
  • 下载

java自定义注解

  • 2016年12月27日 14:43
  • 9KB
  • 下载

Java基础之--反射、自定义注解

反射的定义:通过用字符串创建对象,通过字符串来调用函数。 例: package reflex; import org.junit.Test; /**  * 反射实例  * @author S...

java 自定义注解例子

  • 2016年04月19日 10:45
  • 7KB
  • 下载

java自定义注解学习范例

  • 2015年08月04日 14:40
  • 12KB
  • 下载

java反射机制和自定义注解原理分析和实例

1、概述熟悉android开发的都会了解到Android的xUtils框架的ViewUtils模块,简化了findViewById的编写,通过完全注解方式就可以进行UI,资源和事件绑定。实现基本原理就...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java反射以及自定义注解二者的使用
举报原因:
原因补充:

(最多只允许输入30个字)