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注解详解,自定义注解,利用反射解析注解

概要这篇文章将会带领你了解Java注解,注解的使用,注解的解析,利用反射解析运行时注解,相信有一定Java基础的小伙伴一定会接触大量的注解,Spring , Hibernate , MyBatis等著...
  • yangjizhao
  • yangjizhao
  • 2016年05月13日 23:04
  • 4675

Java自定义注解和运行时靠反射获取注解

java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 jav...
  • bao19901210
  • bao19901210
  • 2013年12月08日 16:05
  • 130495

自定义注解以及反射得到当前的调用方法

自定义注解以及反射得到当前的调用方法
  • paincupid
  • paincupid
  • 2016年01月11日 01:21
  • 1745

JAVA自定义注解的使用和定义

最近有所了解到自定义注解的应用,因此学习了一下,在项目后台接口开发中,数据的传输经常有对数据内容格式及一些信息规则的校验,应用注解在数据进入后台的开始使用自定义注解是一种比较可靠的方案。 一、注解的概...
  • tanyunlong_nice
  • tanyunlong_nice
  • 2016年12月10日 20:06
  • 934

java反射机制的业务应用场景-1

好久不写东西,最近整理之前的东西时发现以前有一些写好的东西,其实都是一些学习笔记或是对某个技术理解的一些感想,觉得很有意思,拿出来和大家分享一下。        这篇文章我们先来说一下java的反射...
  • andy_gx
  • andy_gx
  • 2014年03月27日 22:52
  • 1932

java 自定义注解应用实例

本例子旨在使用自定义注解为实体打上 1.定义注解
  • tengdazhang770960436
  • tengdazhang770960436
  • 2014年07月16日 22:33
  • 9328

java注解:如何实现和使用一个自定义注解?

java中注解在java中的应用非常广泛,如override、supperwarning等等注解,框架中的注解应用更为广泛,主流框架基本都有自己的注解体系,今天想总结和学习一下注解的相关知识,第一篇将...
  • wangpengzhi19891223
  • wangpengzhi19891223
  • 2017年09月29日 10:10
  • 758

自定义注解在Spring中的应用

Java注解作为程序元素(类、成员变量、成员方法等)的一种元数据信息,对程序本身的执行不会产生影响。通过自定义注解,可以给程序元素添加特殊的声明。 Spring作为构建企业级应用的平台,提供了丰...
  • liuxigiant
  • liuxigiant
  • 2017年01月09日 23:27
  • 1027

简单自定义Annotation和利用反射获取注解中的值

用一个简单例子 自定义注解: import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;...
  • zxdfc
  • zxdfc
  • 2015年10月20日 00:33
  • 3142

Java反射机制的原理与简单使用

一、 原理     简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息。如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰...
  • superguy2014
  • superguy2014
  • 2016年08月17日 15:11
  • 339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java反射以及自定义注解二者的使用
举报原因:
原因补充:

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