如果某個注解需要一個標(biāo)識,就給它定義一個屬性.
定義的方法:@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD})public @interface MyTest { /** * 對于一人注解類來說。 * value屬性是官方建議取的名稱 * 且value也是默認(rèn)屬性 * 以下定義的屬性,因?yàn)闆]有默認(rèn)值 ,所以用戶 * 在使用時必須給顯式的給值 */ public String value(); /** * 定義一個擁有默認(rèn)值的屬性 */ 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"); //獲取這個方法上的注解的實(shí)例 MyTest mt = m1.getAnnotation(MyTest.class); //獲取這個注解上的屬性的值 String name = mt.name(); String value = mt.value(); System.err.用途:生成表結(jié)構(gòu)并保存,以下是SUN公司提供的注解:
在系統(tǒng)中存在很多的注解,其中有些注解是給JDBC。
@Table – 定義一個類,這個類對應(yīng)一個表-領(lǐng)域模型
@Column – 定義一個類其中的某個字段
@Id -定義主鍵
@OnToMany
@OneToOne
@ManyToMany
9、 注解給反射用并控制事務(wù)對所有的service進(jìn)行代理。
要求:
被代理類必須要擁有接口。
代理的兩個核心類:
Proxy :在內(nèi)存中生成接口的子類。
InvocationHandler : 執(zhí)行句柄,在執(zhí)行代理類的方法時,此Invocationhandler會攔截所有代理類的方法。
示例:
要求對List進(jìn)行代理:
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("執(zhí)行某個方法了:"+method.getName()); //執(zhí)行被代理類 Object returnValue = method.invoke(list, args); return returnValue; } }); //將代理類轉(zhuǎn)換成接口的對象 List list2 = (List) obj; list2.add("ddd"); System.err.println(list2.get(0)); }}
要求實(shí)現(xiàn)一個類可以對所有擁有接口的類都可以代理:
package cn.hx.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 此類不但是工具類,且還是執(zhí)行句柄 * */public class MyProxy2 implements InvocationHandler { /** * 聲明被代理類 */ private Object src; /** * 構(gòu)造 中接收這個被代理的對象 */ private MyProxy2(Object src){ this.src=src; } /** * 提供一個靜態(tài)方法返回代理對象 */ public static Object factory(Object src){ Object proxyedObj = Proxy.newProxyInstance( MyProxy2.class.getClassLoader(), src.getClass().getInterfaces(), new MyProxy2(src)); return proxyedObj; } /** * 實(shí)現(xiàn)執(zhí)行攔截方法 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.err.println("執(zhí)行的方法是>>>>:+"+method.getName()); Object rVlaue = method.invoke(src,args); return rVlaue; }}
新聞熱點(diǎn)
疑難解答
圖片精選