明天来讲讲JAVA种罕用的几种注解,比拟容易应用,也简略
@Override查看笼罩办法是否正确
@Deprecated将这个办法置为不举荐应用的办法
@SupperessWarnings将某种正告提醒疏忽掉,能够放在类后面讲将整个类的这种正告疏忽,也能够放在办法头上,只疏忽这个办法的正告
public class Doer { @Deprecated void doItThisWay(){ } void doItThisNewWay(){ }}@SuppressWarnings("deprecation")public class MyWorker { @SuppressWarnings("deprecation") void doSomeWork(){ Doer d = new Doer(); d.doItThisWay(); } @SuppressWarnings("deprecation") void doDoubleWork(){ Doer d1 = new Doer(); Doer d2 = new Doer(); d1.doItThisWay(); d2.doItThisWay(); }}
自定义注解,通过@interface的形式定义,通过@新注解名字来应用注解
其中Target指定该新定义的注解能够应用在哪个中央@Target(ElementType.TYPE),@Target({ElementType.TYPE,ElementType.METHOD})等示意
另外Retention示意能够在何时能够获取到该新注解,RUNTIME示意在运行时能够获取到(想要通过反射获取到必须应用这种RUNTIME)
定义的变量能够设置为default值
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface WorkHandler { boolean useThreadPool() default true;}
应用新注解,当下面的定义default时true时候,上面如果是(useThreadPool = true)则能够去掉,除非设置为false必填写
这样通过注解能够判断是否应用线程池
@WorkHandler(useThreadPool = true)public class AccountWorker implements Runnable, TaskWorker { BankAccount ba; public void setTarget(Object target) { if(BankAccount.class.isInstance(target)) ba = (BankAccount) target; else System.out.println("Not BankAccount"); } public void doWork(){ Thread t = new Thread(HighVolumeAccount.class.isInstance(ba) ? (HighVolumeAccount)ba: this); t.start(); } @Override public void run() { char txType = 'w'; int amt = 200; if(txType =='w') ba.withdrawal(amt); else ba.deposit(amt); }}
执行办法:
com.example.demo.pluralsight.runtimetype.BankAccount acct2 = new com.example.demo.pluralsight.runtimetype.BankAccount("2");startWork("com.example.demo.pluralsight.metadatawithannotations.AccountWorker",acct2);Thread.sleep(100);System.out.println("TaskAccountWorker:"+acct2.getBalance());private static void startWork(String workerTypeName, Object workerTarget){ try{ Class<?> workerType = Class.forName(workerTypeName); AccountWorker worker= (AccountWorker)workerType.newInstance(); worker.setTarget(workerTarget); ExecutorService pool = Executors.newFixedThreadPool(3); WorkHandler wh = workerType.getAnnotation(WorkHandler.class); if(wh == null) throw new Exception("WorkHandler is null"); if(wh.useThreadPool()) pool.submit(new Runnable() { @Override public void run() { worker.doWork(); } }); else worker.doWork(); pool.shutdown(); }catch (Exception e){ e.printStackTrace(); }}
还能够简写,间接定义新注解的变量名称为value,这样在类的后面写入的注解就能够间接写成@WorkHandler(false)
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface WorkHandler { boolean value() default true;}
自定义注解的变量类型能够为,Primitive type,String,Enum,Annotation,Class<?>,同时也能够是这些类型的数组。
传入class的形式,这样又能够节俭一个传入参数
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface ProcessedBy { Class<?> value();}@ProcessedBy(AccountWorkerProcessBy.class)public class BankAccount { private String id; private int balance = 0; public BankAccount(String id){ this.id = id; } public BankAccount(String id,int startBalance){ this.id = id; balance = startBalance; } public String getId(){ return id; } public synchronized int getBalance(){ return balance; } public synchronized void deposit(int amount){ balance += amount; } public synchronized void withdrawal(int amount){ balance -= amount; }}public class AccountWorkerProcessBy implements Runnable { BankAccount ba; public void setTarget(Object target) { if(BankAccount.class.isInstance(target)) ba = (BankAccount) target; else System.out.println("Not BankAccount"); } public void doWork(){ Thread t = new Thread(this); t.start(); } @Override public void run() { char txType = 'w'; int amt = 200; if(txType =='w') ba.withdrawal(amt); else ba.deposit(amt); }}
执行办法:
BankAccount acct3 = new BankAccount("3");startWorkSelfContained(acct3);System.out.println("startWorkSelfContained:"+acct3.getBalance());private static void startWorkSelfContained(Object workerTarget) throws Exception{ Class<?> targetType = workerTarget.getClass(); ProcessedBy pb = targetType.getAnnotation(ProcessedBy.class); Class<?> workerType = pb.value(); AccountWorkerProcessBy worker = (AccountWorkerProcessBy) workerType.newInstance(); worker.setTarget(workerTarget); worker.doWork();}输入startWorkSelfContained:-200