さて、前回のJava注釈2の理解は、Javaの注釈の理解1、すでにJavaの注釈のいくつかの基本的な知識について話している、のは、特定のアプリケーションを見てみましょう。
これまでの説明は比較的簡単で、読んだ後は少し不満を感じるパートナーも多いのですが、何を書いていますか?それはほとんど何も書かれていない、何も乾いていないようなものです!ただし、以前に書いたのは非常に単純なアプリケーションであり、Javaアノテーションを少し読んだことがある人なら誰でも作成できます。
実際、多くのパートナーは、注釈が魔法のようであり、それらを理解したいと思っていますが、どこから始めればよいのかわかりません。注釈は、神秘的で、複雑で、使いにくいように見えます。例:同僚がクラス、メソッド、または属性に注釈を追加しているのを見ると、権限を確認したり、パラメーターを確認したり、属性を処理したりすることができます。一見すると、クラウドでは非常に背が高くなっています。実際、注釈のベールを注意深くカットすると、これは深すぎないことがわかります。
次に、特別なオブジェクトが統一された方法でカプセル化される場合の注釈の使用について説明します。
まず、このオブジェクトに添付ファイルがあることを識別するための注釈を作成します。添付ファイルオブジェクトを取得するには(ウォーターコードを開始する)、再帰的に(ドリルダウン)する必要があります。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AttachAnnotion {
}
次に、トピックに直接移動し、添付ファイルオブジェクトAttachInfoListを作成して、refIdと添付ファイルコレクションattachInfosを含む添付ファイルをアップロードする場所を特定します。
@Data
public class AttachInfoList extends BaseVO{
private String refId ;
private List<AttachVO> attachVOList;
}
以下にページオブジェクトPageTestVOを作成します
@Data
public class PageTestVO extends BaseVO {
private String pageName;
@AttachAnnotion
private ParagraphVO paragraphVO;
//单个文件
private AttachInfoList attachInfo;
//多个文件
private List<AttachInfoList> attachInfos;
private String imageRefId;
}
その中にparagraphVOは、ファイル情報も含む段落です。
@Data
public class ParagraphVO extends BaseVO {
private String name ;
/**
* 附件
*/
private AttachInfoList attachInfoLists;
}
オブジェクトが作成された後、問題は以下のリフレクションとアノテーションによって処理されます。コードにはさらに詳細なアノテーションが付けられています。見てみましょう〜
package com.example.demo;
import com.alibaba.fastjson.JSON;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class AnnoTest {
public static void main(String[] args) {
PageTestVO base = new PageTestVO();
List<AttachInfoList> attachInfos = new ArrayList<>();
// 单个--- attachInfo
AttachInfoList attachInfo = new AttachInfoList();
AttachVO test111 = new AttachVO("111", "test111");
List<AttachVO> list1 = new ArrayList<>();
list1.add(test111);
attachInfo.setAttachVOList(list1);
attachInfo.setRefId("test111");
base.setAttachInfo(attachInfo);
//多个 ----- attachInfos
AttachInfoList attachInfo2 = new AttachInfoList();
AttachVO test222 = new AttachVO("222", "test222");
List<AttachVO> list2 = new ArrayList<>();
list2.add(test222);
attachInfo2.setAttachVOList(list2);
AttachInfoList attachInfo3 = new AttachInfoList();
AttachVO test333 = new AttachVO("333", "test333");
List<AttachVO> list3 = new ArrayList<>();
list3.add(test333);
attachInfo3.setAttachVOList(list3);
List<AttachInfoList> attachInfoLists23 = new ArrayList<>();
attachInfoLists23.add(attachInfo2);
attachInfoLists23.add(attachInfo3);
base.setAttachInfos(attachInfoLists23);
//注解嵌套 -----paragraphVO
AttachInfoList attachInfo4 = new AttachInfoList();
AttachVO test444 = new AttachVO("444", "test444");
List<AttachVO> list4 = new ArrayList<>();
list4.add(test444);
attachInfo4.setAttachVOList(list4);
ParagraphVO paragraphVO = new ParagraphVO();
paragraphVO.setAttachInfoLists(attachInfo4);
base.setParagraphVO(paragraphVO);
dealAttachInfo(base, attachInfos);
System.out.println("数据附件提取:" + JSON.toJSON(attachInfos));
}
public static <T> void dealAttachInfo(T base, List<AttachInfoList> attachInfos) {
// 为空不处理
if (base == null) {
return;
}
// 对象是AttachInfoList,直接处理
if (base instanceof AttachInfoList) {
attachInfos.add((AttachInfoList) base);
return;
}
// 集合遍历处理
if (base instanceof List) {
Iterator it = ((List) base).iterator();
while (it.hasNext()) {
dealAttachInfo(it.next(), attachInfos);
}
} else {
//处理逻辑
Class<?> baseClass = base.getClass();
//遍历属性处理
Field[] fields = baseClass.getDeclaredFields();
try {
for (Field field : fields) {
String name = field.getName(); //属性名称
String getMethodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); //获取该属性的方法名
Method method = baseClass.getMethod(getMethodName); //获取该属性的方法
Object obj = method.invoke(base); //该属性类型及值
//这个属性是AttachInfoList,那么直接封装禁attachInfos
if (obj == null) continue;
if (obj instanceof AttachInfoList) {
attachInfos.add((AttachInfoList) obj);
} else if (obj instanceof List && ((List) obj).size() > 0 && ((List) obj).get(0) instanceof AttachInfoList) {
attachInfos.addAll((List) obj);
} else {
//如果不是,继续查找注解,看看是否需要继续下钻
AttachAnnotion attachAnnotion = field.getDeclaredAnnotation(AttachAnnotion.class); //是否有文件注解
if (attachAnnotion != null) {
if (obj instanceof List) {
for (Object ob : (List) obj) {
dealAttachInfo(ob, attachInfos);
}
} else {
dealAttachInfo(obj, attachInfos);
}
}
}
}
} catch (Exception e) {
System.out.println("出现错误:" + e.getMessage() + " location:" + e.getLocalizedMessage());
}
}
}
}
操作の結果を全員に見てもらいます。
com.example.demo.AnnoTest
数据附件提取:[{"attachVOList":[{"name":"test444","attachId":"444"}]},{"refId":"test111","attachVOList":[{"name":"test111","attachId":"111"}]},{"attachVOList":[{"name":"test222","attachId":"222"}]},{"attachVOList":[{"name":"test333","attachId":"333"}]}]
私はすべてのコードを直接コピーしました。ここでいくつかのポイントを言いたいと思います。1。このロジックは複雑ですが、実際には表示されません。
//多个文件
private List<AttachInfoList> attachInfos;
AttachInfoList自体は、関連付けられたIDを持つ添付ファイルのコレクションであるため、複数ある場合は、それらを再度収集するのではなく、複数のAttachInfoListを作成する必要があることは明らかです。もちろん、コード内のいくつかのものは削除できますが、それを処理しなくても問題はありませんが、ロジックは消えません。
2.一部のパートナーは、ねえ?私は注釈を使用せず、リフレクションを使用してそれを実行します!そのとおり!はい、注釈を使用せずにレイヤーごとに再帰して添付ファイル情報を取得できますが、注釈マークがないため、オブジェクトにファイルがあるかどうかに関係なく、各オブジェクトを再帰します。これはパフォーマンスにあまり適していません。パフォーマンスコストはそれほど高くなくても。
3.これは実際には添付ファイルを抽出するだけです。保存する場合は、データ処理をアセンブルする必要があります。refIdアソシエーションの作成などに注意してください。同時に、ファイルをバッチで処理することもできるようです。クエリ。興味のある友達は試すことができます。