@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}上面是@Deprecated这个annotation的源码,编译器是怎么知道这个annotation是什么意思的。
要是我自定义的annotation怎么让编译器知道,我这个annotation是做什么的。
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}上面是@Deprecated这个annotation的源码,编译器是怎么知道这个annotation是什么意思的。
要是我自定义的annotation怎么让编译器知道,我这个annotation是做什么的。
为 Java 编程语言注释设施提供库支持
去看看吧!可能有帮助!
其实Annotation 就是无数据<数据的数据>
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Logger
{
String desc();
}
自定义的接口:
/**
* @author xKF17084
*
*/
public abstract interface UserInfoManage extends Manage
{
@Logger(desc = "删除用户信息")
public void remove(Object user);
}接口实现类:
public class UserInfoManageImpl implements UserInfoManage
{
@Override
public void register(Object user)
{
// TODO Auto-generated method stub
System.out.println(((User)user).getUserName());
} @Override
public void update(Object user)
{
// TODO Auto-generated method stub
System.out.println(((User)user).getUserName());
} public void remove(Object user)
{
// TODO Auto-generated method stub
System.out.println("remove : "+((User)user).getUserName());
}
拦截器类:
public class DynamicProxyHandler implements InvocationHandler
{ Class busClass = null;
/**
* 生成一个代理类,此类是业务类和处理类合并后的类
* @param busClass
* @return
*/
public Object bind(Class busClass)
{
this.busClass = busClass;
return Proxy.newProxyInstance(busClass.getClassLoader(),
busClass.getInterfaces(), this);
}
/* (non-Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
// TODO Auto-generated method stub
System.out.println("Invoke before!!!");
boolean isAnn = method.isAnnotationPresent(Logger.class);
if(isAnn)
{
Logger log = (Logger)method.getAnnotation(Logger.class);
System.out.println("日志输出:---------->"+log.desc());
System.out.println("=================================");
}
method.invoke(busClass.newInstance(), args);
System.out.println("Invoke after!!!");
return null;
}
/*public static void main(String[] args)
{
DynamicProxyHandler handler = new DynamicProxyHandler();
BusinessInterface buss = new BusinessClass();
buss = (BusinessInterface)handler.bind(buss);
buss.doSomething();
BusinessInterface buss2 = new BusinessClass();
buss2 = (BusinessInterface)handler.bind(buss2);
buss2.doSomething();
}*/
}
主函数:
public class MainClazz
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
String clazzName = "com.demo.aop.bussManage.impl.UserInfoManageImpl";
Map<String,Object> cachInstance = new HashMap<String,Object>();
try
{
Class clazz = (Class) Class.forName(clazzName);
DynamicProxyHandler handler = new DynamicProxyHandler();
cachInstance.put("userInfoManage", handler.bind(clazz));
UserInfoManage mange = (UserInfoManage)cachInstance.get("userInfoManage");
User user = new User();
user.setUserName("yajun");
mange.remove(user);
} catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}}测试输出:
Invoke before!!!
日志输出:---------->删除用户信息
=================================
remove : yajun
Invoke after!!!