如果某個注解需要一個標識,就給它定義一個屬性.
定義的方法:@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.用途:生成表結構并保存,以下是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; }}
新聞熱點
疑難解答