首页 > 学院 > 开发设计 > 正文

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

2019-11-15 00:15:05
字体:
来源:转载
供稿:网友
给注解定义属性/方法与给反射用并控制事务 (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;    }}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表