java注解问题?通俗易懂的讲解法

求是科技 发布于 2016/09/26 15:45
阅读 533
收藏 1
看完了java注解,依然不明白注解有什么用?谢大神通俗的解法,最好是举个例子。或直接讲解@RestController有什么用(加了注解会做哪些事情)
加载中
0
szwx855
szwx855

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。

一般你大概记住如下过程就行了。

1、写个元注解。然后定义好方法,或者构造器,或者属性。

2、在自己的类中@你的注解。

3、在另外一个类中(处理注解的类,一般是AOP)中操作这些有注解的类。


例子:这个例子很简单的将有注释的方法射进去一个fieldName


元注解:
package annotation;

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

/**
 * 〈一句话功能简述〉<br>
 * 〈功能详细描述〉
 *
 * @author 16080951(林健)
 * @Copyright (c) 2016 苏宁软件技术有限公司 版权所有
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestNoatation {
    String name() default "fieldName";
}


===================================我是分割线=======================
使用元注解的类:
package annotation;

/**
 * 〈一句话功能简述〉<br>
 * 〈功能详细描述〉
 *
 * @author 16080951(林健)
 * @Copyright (c) 2016 苏宁软件技术有限公司 版权所有
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class A {

    private String name;

    public String getName() {
        return name;
    }

    @TestNoatation
    public void setName(String name){
        this.name = name;
    }
}


===================================我是分割线=======================
通过反射技术来对有注解的类进行反射处理,并执行里面的getName。
package annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 〈一句话功能简述〉<br>
 * 〈功能详细描述〉
 *
 * @author 16080951(林健)
 * @Copyright (c) 2016 苏宁软件技术有限公司 版权所有
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class AnnotationTest {

    public static void parseType(){
        try {
            Class clazz = Class.forName("annotation.A");
            Annotation[] annotation = clazz.getAnnotations();
            for (Annotation annotation1 : annotation) {
                A a = (A)annotation1;
                System.out.println(a);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void parseMethod() throws Exception {

        Method method[] = A.class.getDeclaredMethods();
        for (Method method1 : method) {
            TestNoatation isNottation = method1.getAnnotation(TestNoatation.class);
            if (isNottation != null ) {
                //找到注解

                //找到了这个类中的这个注解方法。然后我们可以对这个方法做一堆的操作。比如设置里面的name什么的。
                A a = A.class.newInstance();
                method1.invoke(a,isNottation.name());
                System.out.println("methodName : " + method1.getName() + ",TestNoatationName:" + isNottation.name() );

                //将反射设置好的name,通过method1.getName打印出来。
                System.out.println("通过反射后,名字为:"+ a.getName());
            }
        }

    }


    public static void main(String[] args) {

        try {
            parseMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

===================================我是分割线=======================
打印结果:
methodName : setName,TestNoatationName:fieldName
通过反射后,名字为:fieldName




0
skhuhu
skhuhu
相当于开放个接口····restful 的···· 无法执行页面跳转   类似ajax 返回数据 json string 之类的···如果需要页面跳转还是controller ····
0
GameKing
GameKing

     注解本身没有任何作用,只是表明这个class or method 有了这个注解,它的作用取决于 语言 或者 框架 要用他去干什么....

    像问题中的例子,spring检测到该注解时,会对该类进行restful风格处理,但是注意,这是spring的行为,而不是这个注解自身的行为...你也可以写个框架对所有加注了该注解的类进行删除...

    就像一块铁,最终变成什么取决于你怎么锻造它.

0
szwx855
szwx855
其实说白了,就是通过反射,找到有你元注解的类或方法。执行处理业务。
0
szwx855
szwx855
希望被采纳哦。。
0
loyal
loyal
意思就是你在你家猪屁股上印了个红章,不管它跑到哪,你都知道它是你的.
所以,你找到它了就可以红烧了.想干什么干什么.
zhuoan
zhuoan
这个比喻66的!
0
番茄酱汁
番茄酱汁
特殊的类或则方法,完成特定的功能,就相当于加个标识符一样
0
二环南路上的狂奔
二环南路上的狂奔
弄明白反射就好理解了
返回顶部
顶部