如果某个注解需要一个标识,就给它定义一个属性.
定义的方法:@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD})public @interface MyTest { /** * 对于一人注解类来说。 * value属性是官方建议取的名称 * 且value也是默认属性 * 以下定义的属性,因为没有默认值 ,所以用户 * 在使用时必须给显式的给值 */ public String value(); /** * 定义一个拥有默认值的属性 */ public String name() default "NoName";}
获取注解上的属性的值:
|
|
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; }}
新闻热点
疑难解答