你的位置:首页 > Java教程

[Java教程]给注解定义属性/方法与给反射用并控制事务 (66)


8、给注解定义属性/方法

如果某个注解需要一个标识,就给它定义一个属性.

定义的方法:@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD})public @interface MyTest {  /**   * 对于一人注解类来说。   * value属性是官方建议取的名称   * 且value也是默认属性   * 以下定义的属性,因为没有默认值 ,所以用户   * 在使用时必须给显式的给值   */  public String value();  /**   * 定义一个拥有默认值的属性   */  public String name() default "NoName";}

获取注解上的属性的值:

 

<A extends Annotation>
A


 

getAnnotation(Class<A> annotationClass)
          如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

public class AnlyValueDemo {  public static void main(String[] args) throws Exception {    RunTest run = new RunTest();    Method m1 = run.getClass().getMethod("bbb");    //获取这个方法上的注解的实例    MyTest mt = m1.getAnnotation(MyTest.class);     //获取这个注解上的属性的值    String name = mt.name();    String value = mt.value();    System.err.println(name+","+value);  }}

用途:生成表结构并保存,以下是SUN公司提供的注解:

       在系统中存在很多的注解,其中有些注解是给JDBC

       @Table – 定义一个类,这个类对应一个表-领域模型

       @Column – 定义一个类其中的某个字段

       @Id  定义主键

       @OnToMany

       @OneToOne

       @ManyToMany

9、  注解给反射用并控制事务

对所有的service进行代理。

       要求:

              被代理类必须要拥有接口。

       代理的两个核心类:

              Proxy :在内存中生成接口的子类。

              InvocationHandler : 执行句柄,在执行代理类的方法时,此Invocationhandler会拦截所有代理类的方法。

 

示例:

要求对List进行代理:

package cn.hx.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.List;public class ProxyDemo {  public static void main(String[] args) throws Exception {    //声明被代理类    final List list = new ArrayList();    //生成代理类    Object obj = Proxy.newProxyInstance(        ProxyDemo.class.getClassLoader(),        new Class[]{List.class},        new InvocationHandler() {          public Object invoke(Object proxy, Method method, Object[] args)              throws Throwable {            System.err.println("执行某个方法了:"+method.getName());            //执行被代理类            Object returnValue = method.invoke(list, args);            return returnValue;          }        });    //将代理类转换成接口的对象    List list2 = (List) obj;    list2.add("ddd");    System.err.println(list2.get(0));  }}

要求实现一个类可以对所有拥有接口的类都可以代理:

package cn.hx.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 此类不但是工具类,且还是执行句柄 * */public class MyProxy2 implements InvocationHandler {  /**   * 声明被代理类   */  private Object src;  /**   * 构造 中接收这个被代理的对象   */  private MyProxy2(Object src){    this.src=src;  }  /**   * 提供一个静态方法返回代理对象   */  public static Object factory(Object src){    Object proxyedObj =         Proxy.newProxyInstance(            MyProxy2.class.getClassLoader(),            src.getClass().getInterfaces(),            new MyProxy2(src));    return proxyedObj;  }  /**   * 实现执行拦截方法   */  public Object invoke(Object proxy, Method method, Object[] args)      throws Throwable {    System.err.println("执行的方法是>>>>:+"+method.getName());    Object rVlaue = method.invoke(src,args);    return rVlaue;  }}