首页 > 代码库 > Annotation注释笔记

Annotation注释笔记

没学之前我还以为注释不就是//或是/**/,现在才知道里面花样多着呢。还分了好几类先对注解有个基本的了解吧!

Java定义的元注解:
    1.@Target:说明了Annotation所修饰的对象范围
    2.@Retention:定义了该Annotation被保留的时间长短
    3.@Documented:描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化
    4.@Inherited:阐述了某个被标注的类型是被继承的。

注解本身没什么特别大的作用,但是我们可以利用反射来获取这些消息。

当然对于我来说的话,自定义注解还是要多敲一敲的,供上代码~

package AnnotationTest;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

//import java.awt.Button;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class AnnotationForTest {

/*
* 使用AnnotationFor注解来为ok按钮和cancel按钮绑定事件监听器
*/

private JFrame mainWin=new JFrame("事件绑定器");
//使用annotation为ok按钮绑定事件监听器
@ActionListenerFor (listener = OKLisener.class)
private JButton ok=new JButton("确定");
//使用annotation为cancel按钮绑定事件监听器
@ActionListenerFor (listener = CancelLisener.class)
private JButton cancel=new JButton("取消");
public void init()
{
//初始化界面方法
JPanel jp=new JPanel();
jp.add(ok);
jp.add(cancel);
mainWin.add(jp);
ActionListenerInstaller.processAnnotations(this);
mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWin.pack();
mainWin.setVisible(true);
}
public static void main(String[] args)
{
new AnnotationForTest().init();
}
}
//定义ok按钮得事件监听器实现类
class OKLisener implements ActionListener
{
public void actionPerformed(ActionEvent ext)
{
JOptionPane.showMessageDialog(null, "单击了确定按钮");
}
}
//定义cancel按钮得事件监听器实现类
class CancelLisener implements ActionListener
{
public void actionPerformed(ActionEvent ext)
{
JOptionPane.showMessageDialog(null, "单击了取消按钮");
}
}

 

 

package AnnotationTest;

import java.awt.event.ActionListener;
import java.lang.reflect.Field;

import javax.swing.AbstractButton;
/*
*
*/
public class ActionListenerInstaller {
//处理annotation的方法,其中obj是包含annotation的对象
public static void processAnnotations(Object obj)
{
try{//获取obj对象的类
Class c1=obj.getClass();
//获取指定obj对象的所有成员变量,并遍历每个成员变量
for(Field f:c1.getDeclaredFields())
{
//将该成员变量设置成自由访问
f.setAccessible(true);
//获取该成员变量上的actionlistenerfor类型的annotation
ActionListenerFor a=f.getAnnotation(ActionListenerFor.class);
//获取成员变量f的值
Object fObj=f.get(obj);
//如果f是abstractbutton的实例,且a不为Null
if(a!=null && fObj!=null && fObj instanceof AbstractButton)
{
//获取a注解里的listener元数据(他是一个监听类)
Class<? extends ActionListener> listenerClazz=a.listener();
//使用反射来创建listener类的对象
ActionListener a1=listenerClazz.newInstance();
AbstractButton ab=(AbstractButton)fObj;
//为ab按钮添加事件监听器
ab.addActionListener(a1);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

 

 

 

package AnnotationTest;

import java.awt.event.ActionListener;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
/*
* 使用AnnotationFor注解来为ok按钮和cancel按钮绑定事件监听器
*
*/
@Target(value=http://www.mamicode.com/ElementType.FIELD)
@Retention (value=http://www.mamicode.com/RetentionPolicy.RUNTIME)
/*
* 本来还有
* RetentionPolicy cannot be resolved to a variable和
* ElementType cannot be resolved to a variable错误
* 可以通过手动导入
* import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
* 就可以解决啦
*/
public @interface ActionListenerFor {
Class<? extends ActionListener> listener();
}

 

 

 

这样看自定义Annotation是不是还有点像接口,然而并不是...其实主要是自己动手敲,可能会出很多错,但是在解决这些错误的同时你也会有所收获。不过必须不必要犯的错要尽量避免。加油哈

Annotation注释笔记