注解-一个让人头疼且又郁闷的东西,现在为大家讲解的是深入注解
如果你对注解一无所知,或者不够了解,建议先去学习注解的基础。
下面为大家提供一个注解biz的实现过程(仿常用逻辑加工)
首先我们需要为使用者提供两个注解类
Biz类以及Method类。Biz类注解用于指示我这个逻辑对象实现哪一个类的逻辑代码。Method类用于指示我的逻辑类的方法名,便于我去执行这一个逻辑类中的方法
package org.pro.auto.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Biz{
public Class<?> t();
}
package org.pro.auto.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Method {
public String method();
}
接着就是最为重要的一步,去读取某一个类的注解。首先我们来为一个Biz类去说明这个类需要实现的类对象
TTTe对象是逻辑实现层对象,它用于编写方法
package org.pro.auto.code;
import org.pro.auto.annotation.Method;
public class TTTe {
@Method(method="test")
public String test(){
System.out.println("测试");
return "成功";
}
@Method(method="tees")
public void tees(String str,boolean tess){
System.out.println("你好"+str+tess);
}
}
TestAnn对象代表接口对象,指示我这个对象需要实现的方法及业务处理
package org.pro.auto.code;
import org.pro.auto.ann.AnnExample;
import org.pro.auto.annotation.Biz;
@Biz(t = TTTe.class)
public class TestAnn {
public String test(){
String value = null;
try {
value = (String) AnnExample.example(TestAnn.class, "test");
} catch (Exception e) {
e.printStackTrace();
}
return "true"+value;
}
}
上放TestAnn对象所示,我这个TestAnn对象实现类所需要实现TTTe对象序列
从TTTe对象中可以看到对应的test方法
整个注解类通过AnnExample对象的example方法去实现序列,读取注解以及执行方法
package org.pro.auto.ann;
import org.pro.auto.annotation.Biz;
import org.pro.auto.annotation.Method;
public class AnnExample {
/**
* 实例化执行注解对象
* @param t 被注解的类
* @param methodName 方法名
* @param pro 参数
* @throws Exception 异常对象
*/
public static Object example(Class<?> t,String methodName,Object... pro) throws Exception {
Object object = null;
if (t.isAnnotationPresent(Biz.class)) {
Biz table = t.getAnnotation(Biz.class);
t = table.t();
java.lang.reflect.Method[] methods= t.getMethods();
for (java.lang.reflect.Method method1 : methods) {
if (method1.isAnnotationPresent(Method.class)) {
Method m = method1.getAnnotation(Method.class);
if(null != methodName && m.method().equals(methodName)){
object = method1.invoke(t.newInstance(), pro);
}
}
}
}
return object;
}
}
下面是执行逻辑方法的示例main方法
package org.pro.auto;
import org.pro.auto.ann.AnnExample;
import org.pro.auto.annotation.Biz;
import org.pro.auto.code.TestAnn;
@Biz(t = TestAnn.class)
public class Test {
public static void main(String[] args) {
try {
System.out.println(AnnExample.example(Test.class, "test"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过Biz对象实例话TestAnn对象,通过该对象去执行AnnExample.example()方法
该方法的第一个参数Class<?> t 作用于搜索该对象中Biz对象的实例,去获取该实例的Method注解