当前位置: 首页 > 后端技术 > Java

JAVA基础常用注解

时间:2023-04-01 19:55:19 Java

今天就说说JAVA中常用的几种注解,比较好用,也比较简单。@Override检查覆盖方法是否正确。@Deprecated将此方法设置为已弃用的方法。@SupperessWarnings忽略某种警告提示,可以放在类的前面,这种对整个类的警告都忽略,也可以放在方法头,只忽略这个方法的警告publicclassDoer{@DeprecatedvoiddoItThisWay(){}voiddoItThisNewWay(){}}@SuppressWarnings("弃用")publicclassMyWorker{@SuppressWarnings("弃用")voiddoSomeWork(){Doerd=newDoer();d.doItThisWay();}@SuppressWarnings("deprecation")voiddoDoubleWork(){Doerd1=newDoer();Doerd2=newDoer();d1.doItThisWay();d2.doItThisWay();}}自定义注解,由@interface定义,通过@new注解名称使用注解,其中Target指定新定义的注解可以使用@Target(ElementType.TYPE),@Target({ElementType.TYPE,ElementType.METHOD})等。另外,Retention表示什么时候可以获取到新的注解,RUNTIME表示可以在运行时获取到(如果要通过反射获取,必须使用这个RUNTIME)定义的变量可以设置为默认值@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public@interfaceWorkHandler{booleanuseThreadPool()defaulttrue;}使用新的注解,当上面的定义default为true时,如果下面是(useThreadPool=true),可以去掉,除非设置为false,必须填写,这样可以通过注解判断是否使用线程池@WorkHandler(useThreadPool=true)publicclassAccountWorker实现Runnable,TaskWorker{BankAccountba;publicvoidsetTarget(Objecttarget){if(BankAccount.class.isInstance(target))ba=(BankAccount)target;elseSystem.out.println("不是银行账户");}publicvoiddoWork(){Threadt=newThread(HighVolumeAccount.class.isInstance(ba)?(HighVolumeAccount)ba:this);t.开始();}@Overridepublicvoidrun(){chartxType='w';整数=200;如果(txType=='w')ba.withdrawal(amt);否则ba.deposit(amt);}}执行方法:com.example.demo.pluralsight.runtimetype.BankAccountacct2=newcom.example.demo.pluralsight.runtimetype.BankAccount("2");startWork("com.example.demo.pluralsight.metadatawithannotations.AccountWorker",acct2);Thread.sleep(100);System.out.println("任务AccountWorker:"+acct2.getBalance());privatestaticvoidstartWork(StringworkerTypeName,ObjectworkerTarget){尝试{ClassworkerType=Class.forName(workerTypeName);AccountWorkerworker=(AccountWorker)workerType.newInstance();worker.setTarget(workerTarget);ExecutorServicepool=Executors.newFixedThreadPool(3);WorkHandlerwh=workerType.getAnnotation(WorkHandler.class);if(wh==null)thrownewException("WorkHandlerisnull");if(wh.useThreadPool())pool.submit(newRunnable(){@Overridepublicvoidrun(){worker.doWork();}});elseworker.doWork();pool.shutdown();}catch(Exceptione){e.printStackTrace();}}也可以简写,直接把新注解的变量名定义为value,这样写在类前面的注解就可以直接写成@WorkHandler(false)@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public@interfaceWorkHandler{booleanvalue()defaulttrue;}自定义注解的变量类型可以是Primitive类型、String、Enum、Annotation、Class,也可以是这些类型的数组。class的传入方式,可以保存另一个传参@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public@interfaceProcessedBy{Classvalue();}@ProcessedBy(AccountWorkerProcessBy.class)publicclassBankAccount{私人字符串id;私人int余额=0;publicBankAccount(Stringid){this.id=id;}publicBankAccount(Stringid,intstartBalance){this.id=id;余额=开始余额;}publicStringgetId(){返回id;}publicsynchronizedintgetBalance(){返回余额;}publicsynchronizedvoiddeposit(intamount){balance+=amount;}publicsynchronizedvoidwithdrawal(intamount){balance-=amount;}}公共类AccountWorkerProcessBy实现Runnable{BankAccountba;publicvoidsetTarget(对象目标){if(BankAccount.class.isInstance(target))ba=(BankAccount)目标;elseSystem.out.println("不是银行账户");}publicvoiddoWork(){Threadt=newThread(this);t.开始();}@Overridepublicvoidrun(){chartxType='w';整数=200;如果(txType=='w')ba.withdrawal(amt);否则ba.deposit(amt);}}操作方法:BankAccountacct3=newBankAccount("3");startWorkSelfContained(acct3);System.out.println("startWorkSelfContained:"+acct3.getBalance());privatestaticvoidstartWorkSelfContained(ObjectworkerTarget)throwsException{类targetType=workerTarget.getClass();ProcessedBypb=targetType.getAnnotation(ProcessedBy.class);类workerType=pb.value();AccountWorkerProcessByworker=(AccountWorkerProcessBy)workerType.newInstance();worker.setTarget(workerTarget);worker.doWork();}输出startWorkSelfContained:-200