日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

都說了別用BeanUtils.copyProperties,這不翻車了吧

來源: 責(zé)編: 時(shí)間:2024-02-29 14:43:25 246觀看
導(dǎo)讀一、故事新年新氣象,小貓也是踏上了新年新征程,自從小貓按照老貓給的建議【系統(tǒng)梳理大法】完完整整地梳理完畢系統(tǒng)之后,小貓對整個(gè)系統(tǒng)的把控可謂又是上到了一個(gè)新的高度。開工一周,事情還不是很多,寥寥幾個(gè)需求,小貓分分鐘

一、故事

新年新氣象,小貓也是踏上了新年新征程,自從小貓按照老貓給的建議【系統(tǒng)梳理大法】完完整整地梳理完畢系統(tǒng)之后,小貓對整個(gè)系統(tǒng)的把控可謂又是上到了一個(gè)新的高度。開工一周,事情還不是很多,寥寥幾個(gè)需求,小貓分分鐘搞定。slq28資訊網(wǎng)——每日最新資訊28at.com

類似于開放平臺的老六接到客戶的需求,需要在查詢訂單新增一個(gè)下單時(shí)間的返回值,然后這就需要提供底層服務(wù)的小貓?jiān)诮涌趯咏o出這個(gè)字段,然后老六通過包裝之后給客戶。由于需求比較簡單,所以加完字段之后,老六和小貓也就直接上線了。slq28資訊網(wǎng)——每日最新資訊28at.com

slq28資訊網(wǎng)——每日最新資訊28at.com

上線之后事兒來了,對面客戶研發(fā)一直詢問為什么還是沒有下單時(shí)間,總是空的。老六于是直接找到了小貓,可是小貓經(jīng)過了一系列的自測發(fā)現(xiàn)返回值都是有的,后來排查到在老六封裝之后值不見了。經(jīng)過仔細(xì)排查,終于找到了問題,雖然沒有造成太大的影響,但是總歸給客戶研發(fā)的心里留下了一個(gè)不好的印象。slq28資訊網(wǎng)——每日最新資訊28at.com

雖然下單時(shí)間老六和小貓定義的都是orderTime這樣一個(gè)字段,但是字段類型小貓用的是Date類型而老六用的是LocalDate,恰巧老六在進(jìn)行對象賦值的時(shí)候偷了個(gè)懶直接用了spring的BeanUtils.copyProperties工具類,于是導(dǎo)致日期類型的值并沒有被賦值過去,踩坑了。slq28資訊網(wǎng)——每日最新資訊28at.com

老六這才回想起前段時(shí)間架構(gòu)師在群里@ALL的一段話,“大家用BeanUtils拷貝對象的時(shí)候注意點(diǎn),有坑啊,大家盡量用get,set方法啊”。當(dāng)時(shí)的老六不以為意,想著,“切,這得多麻煩,一個(gè)個(gè)set不花時(shí)間啊,有工具類不用”。現(xiàn)在想來是真踩到BeanUtils的坑了。slq28資訊網(wǎng)——每日最新資訊28at.com

老六一邊改著代碼一邊叨叨:“這也沒說坑在哪里啊......”slq28資訊網(wǎng)——每日最新資訊28at.com

二、盤點(diǎn)BeanUtils.copyProperties坑點(diǎn)

相信很多小伙伴在日常開發(fā)的過程中都用過BeanUtils.copyProperties。因?yàn)槲覀內(nèi)粘i_發(fā)中,經(jīng)常涉及到DO、DTO、VO對象屬性拷貝賦值。很多開發(fā)為了省去繁瑣而又無聊的set方法往往都會(huì)用到這樣的工具類進(jìn)行值拷貝,但是看似簡單的拷貝程序,其實(shí)往往暗藏坑點(diǎn),這不上面的老六就踩雷了么。slq28資訊網(wǎng)——每日最新資訊28at.com

下面咱們一起來盤點(diǎn)一下這個(gè)拷貝存在哪些坑點(diǎn)吧。見下圖。slq28資訊網(wǎng)——每日最新資訊28at.com

slq28資訊網(wǎng)——每日最新資訊28at.com

盤點(diǎn)slq28資訊網(wǎng)——每日最新資訊28at.com

三、目標(biāo)賦值對象屬性非預(yù)期

這里主要說的是從老對象進(jìn)行屬性拷貝到新對象之后,新對象的屬性值不是所期待的。這里分為兩種。slq28資訊網(wǎng)——每日最新資訊28at.com

  • 兩對象屬性命名一致,但是類型不一致(即老六遇到的坑點(diǎn))。
  • 由于開發(fā)編寫沒有核對好,兩個(gè)對象屬性值不一致,卻采用了拷貝,導(dǎo)致異常。
  • loombook+Boolean類型數(shù)據(jù)+is屬性開頭的坑。
  • 不同內(nèi)部類,相同屬性,目標(biāo)對象賦值有問題。

1.類型不匹配

我們來重放一下老六和小貓遇到坑。代碼如下:slq28資訊網(wǎng)——每日最新資訊28at.com

/** * 公眾號:程序員老貓  **/public class BeanCopyHelper {    public static void main(String[] args) {        Origin a = new Origin();        a.setOrderTime(new Date());        Target b = new Target();        BeanUtils.copyProperties(a,b);        System.out.println(a.getOrderTime());        System.out.println(b.getOrderTime());    }}@Dataclass Origin {    private Date orderTime;}@Dataclass Target {    private LocalDate orderTime;}

輸出結(jié)果:slq28資訊網(wǎng)——每日最新資訊28at.com

Sun Feb 25 21:52:22 CST 2024null

我看看到兩個(gè)對象的命名雖然是一致的,但是一個(gè)是Date另外一個(gè)是LocaDate,這樣導(dǎo)致值并沒有被賦值過去。slq28資訊網(wǎng)——每日最新資訊28at.com

2.兩對象屬性命名差異導(dǎo)致賦值不成功

這種拷貝不成功的原因很多時(shí)候是由于研發(fā)人員粗心,沒有校對好導(dǎo)致的。例如下面兩個(gè)類:slq28資訊網(wǎng)——每日最新資訊28at.com

@Dataclass Origin {    private Date ordertime;}@Dataclass Target {    private Date orderTime;}

這種顯而易見是無法賦值成功的,因?yàn)樽屑?xì)看來兩個(gè)屬性名稱不一致。當(dāng)然不會(huì)賦值成功了。slq28資訊網(wǎng)——每日最新資訊28at.com

四、loombook+Boolean類型數(shù)據(jù)+is屬性開頭的坑

這種情況是比較極端的,在用loombook和不用loombook的情況下是不一樣的。我們看一下下面例子。當(dāng)我們不用loombook的時(shí)候,如下代碼:slq28資訊網(wǎng)——每日最新資訊28at.com

public class BeanCopyHelper {    public static void main(String[] args) {        Origin origin = new Origin();        origin.setOrderTime(true);        Target target = new Target();        BeanUtils.copyProperties(origin,target);        System.out.println(origin.getOrderTime());        System.out.println(target.isOrderTime());    }}class Origin {    private Boolean isOrderTime;    public Boolean getOrderTime() {        return isOrderTime;    }    public void setOrderTime(Boolean orderTime) {        isOrderTime = orderTime;    }}class Target {    private boolean isOrderTime;    public boolean isOrderTime() {        return isOrderTime;    }    public void setOrderTime(boolean orderTime) {        isOrderTime = orderTime;    }}

上面的代碼中,我們看到基礎(chǔ)屬性的類型分別是包裝類還有一個(gè)是非包裝類,屬性的命名都是一致的。其最終的輸出結(jié)果,我們看到兩者是一致的:slq28資訊網(wǎng)——每日最新資訊28at.com

truetrue

如果我們使用loombook的時(shí)候,問題就來了,我們看一下loombook改造之后的代碼:slq28資訊網(wǎng)——每日最新資訊28at.com

public class BeanCopyHelper {    public static void main(String[] args) {        Origin origin = new Origin();        origin.setIsOrderTime(true);        Target target = new Target();        BeanUtils.copyProperties(origin,target);        System.out.println(origin.getIsOrderTime());        System.out.println(target.isOrderTime());    }}@Dataclass Origin {    private Boolean isOrderTime;}@Dataclass Target {    private boolean isOrderTime;}

最后的輸出結(jié)果為:slq28資訊網(wǎng)——每日最新資訊28at.com

truefalse

那么這是為什么呢?老貓?jiān)谶@里簡單分享一下,BeanUtils.copyProperties用戶在兩個(gè)對象之間進(jìn)行屬性的復(fù)制,底層基于JavaBean的內(nèi)省機(jī)制,通過內(nèi)省得到拷貝源對象和目的對象屬性的讀方法和寫方法,然后調(diào)用對應(yīng)的方法進(jìn)行屬性的復(fù)制。slq28資訊網(wǎng)——每日最新資訊28at.com

所以在進(jìn)行拷貝時(shí),如果手動(dòng)生成get和set那么方法分別為:getOrderTime()以及setOrderTime()。我們再來看一下如果采用LoomBook的時(shí)候,那么對應(yīng)的get和set的方法分別為:getIsOrderTime()以及setOrderTime(),拋開set和get本身關(guān)鍵字不看,那么后面的肯定是對應(yīng)不起來了。slq28資訊網(wǎng)——每日最新資訊28at.com

這里我們再發(fā)散一下,如果說對應(yīng)的兩個(gè)類其屬性壓根連get和set方法都沒有設(shè)置,那么兩個(gè)對象能夠被拷貝成功嗎?答案是顯而易見的,無法被拷貝成功。所以這里也是用這個(gè)拷貝方法的時(shí)候的一個(gè)坑點(diǎn)。slq28資訊網(wǎng)——每日最新資訊28at.com

不同內(nèi)部類,相同屬性,目標(biāo)對象賦值有問題。

看標(biāo)題還是比較抽象的,我們一起來看一下下面的代碼實(shí)現(xiàn):slq28資訊網(wǎng)——每日最新資訊28at.com

public class BeanCopyHelper {    public static void main(String[] args) {        Origin test1 = new Origin();        test1.outerName = "程序員老貓";        Origin.InnerClass innerClass = new Origin.InnerClass();        innerClass.InnerName = "程序員老貓 內(nèi)部類";        test1.innerClass = innerClass;        System.out.println(test1);        Target test2 = new Target();        BeanUtils.copyProperties(test1, test2);        System.out.println(test2);    }}@Dataclass Origin {    public String outerName;    public Origin.InnerClass innerClass;    @Data    public static class InnerClass {        public String InnerName;    }}@Dataclass Target {    public String outerName;    public Target.InnerClass innerClass;    @Data    public static class InnerClass {        public String InnerName;    }}

輸出最終結(jié)果如下:slq28資訊網(wǎng)——每日最新資訊28at.com

Origin(outerName=程序員老貓, innerClass=Origin.InnerClass(InnerName=程序員老貓 內(nèi)部類))Target(outerName=程序員老貓, innerClass=null)

最終我們發(fā)現(xiàn)其內(nèi)部內(nèi)的屬性并沒有被賦值過去。slq28資訊網(wǎng)——每日最新資訊28at.com

五、引包沖突導(dǎo)致問題

BeanUtils.copyProperties其實(shí)同命名的方法存在于兩個(gè)不同的包中,一個(gè)是spring的另外一個(gè)是apache的,如果不注意的話,很容易就會(huì)有問題。如下代碼:slq28資訊網(wǎng)——每日最新資訊28at.com

//org.springframework.beans.BeanUtils(源對象在左邊,目標(biāo)對象在右邊)public static void copyProperties(Object source, Object target) throws BeansException //org.apache.commons.beanutils.BeanUtils(源對象在右邊,目標(biāo)對象在左邊)public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException

位于org.springframework.beans包下。其copyProperties方法實(shí)現(xiàn)原理和Apache BeanUtils.copyProperties原理類似,默認(rèn)實(shí)現(xiàn)淺拷貝 區(qū)別在于對PropertyDescriptor(內(nèi)省機(jī)制相關(guān))的處理結(jié)果做了緩存來提升性能。這里大家有興趣可以自行去查閱一下源代碼。slq28資訊網(wǎng)——每日最新資訊28at.com

六、查找字段引用困難

當(dāng)我們在排查問題的時(shí)候,或者在熟悉業(yè)務(wù)的過程中,常常會(huì)想要看一個(gè)整個(gè)屬性值的調(diào)用鏈路,從而來跟蹤其設(shè)值源頭。如果我想看當(dāng)前的這個(gè)屬性是什么時(shí)候被設(shè)值值的時(shí)候,老貓的做法通常是找到當(dāng)前的那個(gè)屬性的set方法,然后使用idea中的“Find Usages”或者快捷鍵ALT+F7。得到需要屬性值被設(shè)置的地方。如下圖,就能清晰看到在哪里設(shè)值了。slq28資訊網(wǎng)——每日最新資訊28at.com

slq28資訊網(wǎng)——每日最新資訊28at.com

調(diào)用鏈路slq28資訊網(wǎng)——每日最新資訊28at.com

但是,如果用了工具類進(jìn)行拷貝的話,那么在代碼復(fù)雜的情況下,我們就很難定位其在什么時(shí)候被調(diào)用的了。slq28資訊網(wǎng)——每日最新資訊28at.com

七、BeanUtils.copyProperties是淺拷貝

在這里,咱們要回憶一下什么時(shí)候淺拷貝,什么是深拷貝。淺拷貝:淺拷貝是指創(chuàng)建一個(gè)新對象,然后將原始對象的內(nèi)容逐個(gè)復(fù)制到新對象中。在淺拷貝中,只有最外層對象被復(fù)制,而內(nèi)部的嵌套對象只是引用而已,沒有被遞歸復(fù)制。這意味著原始對象和淺拷貝對象之間共享內(nèi)部對象,修改其中一個(gè)對象的內(nèi)部對象會(huì)影響到另一個(gè)對象。如下示意圖:slq28資訊網(wǎng)——每日最新資訊28at.com

slq28資訊網(wǎng)——每日最新資訊28at.com

淺拷貝slq28資訊網(wǎng)——每日最新資訊28at.com

深拷貝:深拷貝是指在進(jìn)行復(fù)制操作時(shí),創(chuàng)建一個(gè)完全獨(dú)立的新對象,并遞歸地復(fù)制原始對象及其所有子對象。換句話說,深拷貝會(huì)復(fù)制對象的所有層級,包括對象的屬性、嵌套對象、引用等。因此,原始對象和復(fù)制對象是完全獨(dú)立的,修改其中一個(gè)對象不會(huì)影響另一個(gè)對象。slq28資訊網(wǎng)——每日最新資訊28at.com

slq28資訊網(wǎng)——每日最新資訊28at.com

深拷貝slq28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)上面的描述,我們通過代碼來重現(xiàn)一下坑點(diǎn),具體如下:slq28資訊網(wǎng)——每日最新資訊28at.com

public class Address {    private String city;    ...}public class Person {    private String name;    private Address address;    ...}public class TestMain {    public static void main(String[] args) {        Person sourcePerson = new Person();        sourcePerson.setName("老六");        Address address = new Address();        address.setCity("上海 徐匯");        sourcePerson.setAddress(address);        Person targetPerson = new Person();        BeanUtils.copyProperties(sourcePerson, targetPerson);        System.out.println(targetPerson.getAddress().getCity());        sourcePerson.getAddress().setCity("上海 黃埔");        System.out.println(targetPerson.getAddress().getCity());    }}

輸出結(jié)果為:slq28資訊網(wǎng)——每日最新資訊28at.com

上海 徐匯上海 黃埔

我們很明顯地看到操作原始屬性的地址,直接影響到了新對象的屬性的地址。所以這個(gè)坑大家也要當(dāng)心。當(dāng)然由于淺拷貝的原因?qū)е驴截惓霈F(xiàn)問題還涉及集合類進(jìn)行拷貝。例如我們需要對List或者M(jìn)ap進(jìn)行拷貝的時(shí)候也不能直接去拷貝list以及map。slq28資訊網(wǎng)——每日最新資訊28at.com

八、性能問題

由于BeanUtils.copyProperties其實(shí)底層是通過反射實(shí)現(xiàn)的,所以其程序執(zhí)行的效率還是比較低的。我們看一下下面的對比代碼:slq28資訊網(wǎng)——每日最新資訊28at.com

public class BeanCopyHelper {    public static void main(String[] args) {        Origin test1 = new Origin();        test1.outerName = "公眾號:程序員老貓";        Target test2 = new Target();        long beginTime = System.currentTimeMillis();        for (int i = 0; i < 100000; i++) {  //循環(huán)10萬次            test2.setOuterName(test1.getOuterName());        }        System.out.println(test2);        System.out.println("common setter time:" + (System.currentTimeMillis() - beginTime));        long beginTime2 = System.currentTimeMillis();        for (int i = 0; i < 100000; i++) {  //循環(huán)10萬次            BeanUtils.copyProperties(test1, test2);        }        System.out.println(test2);        System.out.println("common setter time:" + (System.currentTimeMillis() - beginTime2));    }}@Dataclass Origin {    public String outerName;}@Dataclass Target {    public String outerName;}

輸出結(jié)果如下:slq28資訊網(wǎng)——每日最新資訊28at.com

Target(outerName=公眾號:程序員老貓)common setter time:14Target(outerName=公眾號:程序員老貓)common setter time:291

上述結(jié)果,很好地證明了這個(gè)結(jié)論。有小伙伴肯定會(huì)說,這種場景應(yīng)該比較少吧,太極端了。那么極端嗎?大家回憶一下上面老貓?zhí)岬降模绻眠@個(gè)工具復(fù)制List或者M(jìn)ap這種集合的時(shí)候,其實(shí)如果把List和Map當(dāng)做整個(gè)對象來復(fù)制往往是失敗的。相信如果不是小白的話一般都會(huì)知道這個(gè)坑點(diǎn),為了解決這個(gè)問題,很多小伙伴可能會(huì)選擇在List或者M(jìn)ap等集合內(nèi)部進(jìn)行循環(huán)一一遍歷去進(jìn)行單個(gè)對象的拷貝賦值,那么這樣的場景下,性能是不是就受到了影響呢?slq28資訊網(wǎng)——每日最新資訊28at.com

九、替換方案

既然說了bean拷貝工具類這么多的壞話,那么我們?nèi)绾稳ヌ鎿Q這種寫法呢?第一種:當(dāng)然是直接采用原始的get以及set方法了。這種方式好像除了代碼長了一些之外好像也沒有什么缺點(diǎn)了。有小伙伴可能會(huì)跳出來說,這不擼起來麻煩么。不著急,idea這款強(qiáng)大的工具不是已經(jīng)給我們提供插件了么。如下圖:slq28資訊網(wǎng)——每日最新資訊28at.com

slq28資訊網(wǎng)——每日最新資訊28at.com

插件示意圖slq28資訊網(wǎng)——每日最新資訊28at.com

第二種:使用映射工具庫,如MapStruct、ModelMapper等,它們可以自動(dòng)生成屬性映射的代碼。這些工具庫可以減少手動(dòng)編寫setter方法的工作量,并提供更好的性能。如下使用代碼:slq28資訊網(wǎng)——每日最新資訊28at.com

    /**     * 公眾號:程序員老貓     **/    @Mapper      public interface SourceTargetMapper {      SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);      @Mapping(source = "name", target = "name")      @Mapping(source = "age", target = "age")      Target mapToTarget(Source source);      }      //使用    Target target = SourceTargetMapper.INSTANCE.mapToTarget(source);

上述這兩種替換方案,說真的作為開發(fā)者而言,老貓更喜歡第一種,簡單方便,而且不需要依賴第三方maven依賴。第二種個(gè)人感覺用起來反而比較繁瑣,上述當(dāng)然純屬個(gè)人偏好。slq28資訊網(wǎng)——每日最新資訊28at.com

十、總結(jié)

上述小貓和老六的案例中,其實(shí)存在的問題需要我們思考的。slq28資訊網(wǎng)——每日最新資訊28at.com

即使再小再簡單的需求,作為研發(fā)開發(fā)完畢之后,我們可以直接上線么?其實(shí)很多時(shí)候事故往往就是由于“不以為意”發(fā)生的。事故的發(fā)生往往也遵循“墨菲定律”,這就要求我們更要敬畏生產(chǎn),再小的需求點(diǎn)都需要經(jīng)過嚴(yán)格的測試驗(yàn)證才能上線。slq28資訊網(wǎng)——每日最新資訊28at.com

說了那么多BeanUtils.copyProperties的壞話,那么這種拷貝方式是不是真的就一無是處呢?其實(shí)不是的,所謂存在即合理。很多時(shí)候使用的時(shí)候踩坑說白了我們沒有理解好這個(gè)拷貝工具的特性。很多時(shí)候大家在使用使用一個(gè)技術(shù)的時(shí)候都是囫圇吞棗,為了使用而去使用,壓根就沒有深入了解這個(gè)技術(shù)的特性以及使用注意點(diǎn)。所以在我們使用第三方工具的時(shí)候,我們需要更好地了解其特性,知其所以然才能更好更正確地使用。小伙伴們你們覺得呢?slq28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-75349-0.html都說了別用BeanUtils.copyProperties,這不翻車了吧

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: C#多線程開發(fā):深入探索線程同步與示例解析

下一篇: 16 個(gè) CSS @ 規(guī)則,一網(wǎng)打盡!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 6月iOS設(shè)備好評榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個(gè),2023年6月的iOS好評榜和上個(gè)月相比沒有任何排名上的變化,僅僅是部分設(shè)備好評率的下降,長年累月的用戶評價(jià)和逐漸退出市場的老款機(jī)器讓這
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個(gè)月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動(dòng),剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時(shí)35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過14.
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團(tuán)隊(duì)做了容器化,但是帶來的問題是服務(wù)配置文件很麻煩,然后大家在群里進(jìn)行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨(dú)立配置中心和k8s作為配
  • Python異步IO編程的進(jìn)程/線程通信實(shí)現(xiàn)

    這篇文章再講3種方式,同時(shí)講4中進(jìn)程間通信的方式一、 Python 中線程間通信的實(shí)現(xiàn)方式共享變量共享變量是多個(gè)線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 聯(lián)想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯(lián)想此前宣布,將于11月2日19:30召開聯(lián)想秋季輕薄新品發(fā)布會(huì),推出聯(lián)想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
  • 2022爆款:ROG魔霸6 冰川散熱系統(tǒng)持續(xù)護(hù)航

    喜逢開學(xué)季,各大商家開始推出自己的新產(chǎn)品,進(jìn)行打折促銷活動(dòng)。對于忠實(shí)的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現(xiàn)在的
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動(dòng)

    據(jù)10月30日9to5 Mac 消息報(bào)道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯(cuò)的評價(jià),亮點(diǎn)包括行業(yè)領(lǐng)先的性能,令人印象深刻的電池續(xù)航,精美豐
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩性视频在线| 久久久免费av| 一本久道久久综合狠狠爱| 亚洲视频大全| 欧美一区二区视频观看视频| 久久久久久久综合狠狠综合| 欧美国产视频一区二区| 欧美激情在线狂野欧美精品| 国产精品av免费在线观看| 国产欧美二区| 亚洲国内精品在线| 亚洲图片欧洲图片av| 久久久久久伊人| 欧美巨乳波霸| 国产真实乱偷精品视频免| 亚洲欧洲日本在线| 亚洲欧美国产日韩天堂区| 老司机aⅴ在线精品导航| 欧美日韩在线一区| 狠狠色狠狠色综合人人| 日韩视频―中文字幕| 欧美在线精品一区| 欧美日韩成人综合| 国产一在线精品一区在线观看| 亚洲人精品午夜在线观看| 亚洲欧美色婷婷| 麻豆freexxxx性91精品| 国产精品久线观看视频| 91久久视频| 久久国产精品一区二区三区| 欧美日韩一卡二卡| 原创国产精品91| 午夜精品视频在线观看| 欧美jizzhd精品欧美喷水| 国产欧美在线视频| 一区二区三区视频在线观看| 久色成人在线| 国产午夜精品在线| 亚洲视频一二区| 免费观看成人www动漫视频| 国产麻豆视频精品| 一区二区久久| 欧美国产日韩免费| 在线精品在线| 欧美一区二区视频在线观看2020 | 久久动漫亚洲| 欧美日一区二区在线观看| 亚洲国内高清视频| 另类激情亚洲| 韩国福利一区| 欧美在线播放| 国产精品永久| 一区二区三区四区精品| 欧美另类综合| 亚洲欧洲精品一区二区精品久久久| 欧美一区二区三区免费大片| 国产精品对白刺激久久久| 日韩性生活视频| 欧美黄色免费网站| 亚洲电影免费在线| 久久婷婷久久一区二区三区| 国产日韩欧美黄色| 午夜日韩视频| 国产精品久久久久久久久果冻传媒| 亚洲精品在线观看视频| 欧美成人综合一区| 亚洲国产精品va在看黑人| 久久久人成影片一区二区三区 | 亚洲一区二区成人| 国产精品久久午夜| 亚洲无亚洲人成网站77777| 欧美伦理影院| 夜夜精品视频一区二区| 欧美日韩国产成人| 日韩午夜在线| 欧美日本国产| 一区二区三区视频在线播放| 欧美日韩亚洲视频| 一区二区三区成人| 欧美新色视频| 亚洲一区久久久| 国产精品免费观看视频| 亚洲欧美日韩精品| 国产日韩欧美一区二区三区在线观看| 午夜精品美女久久久久av福利| 国产精品视频男人的天堂| 亚洲永久精品大片| 国产精品少妇自拍| 午夜视频一区二区| 国产一区二区黄| 久久久久久尹人网香蕉| 曰本成人黄色| 欧美激情精品久久久久久蜜臀| 亚洲人成在线观看一区二区| 欧美日韩国产片| 亚洲一级黄色av| 国产精品永久免费视频| 欧美在线视频全部完| 黑丝一区二区三区| 你懂的一区二区| 日韩亚洲欧美中文三级| 欧美亚州在线观看| 欧美一区=区| 精品91视频| 欧美激情一区二区三区在线| 一区二区三区高清| 国产欧美精品xxxx另类| 久久全球大尺度高清视频| 亚洲激情视频在线| 欧美日本精品在线| 亚洲欧美国产日韩天堂区| 好吊妞**欧美| 欧美极品色图| 亚洲欧美国产高清va在线播| 国产曰批免费观看久久久| 你懂的一区二区| 亚洲视频在线免费观看| 国产一区二区高清视频| 欧美不卡高清| 亚洲一级二级在线| 在线成人黄色| 欧美视频手机在线| 久久精品视频免费| 日韩一级免费观看| 国产欧美一区二区三区国产幕精品| 久久综合国产精品| 一区二区三区免费网站| 国产日韩亚洲欧美| 欧美激情国产日韩精品一区18| 亚洲欧美国产高清va在线播| 一区二区亚洲精品| 欧美日韩一区二区三| 久久精品国产2020观看福利| 亚洲精品社区| 国产午夜精品美女毛片视频| 欧美激情1区2区3区| 香蕉免费一区二区三区在线观看| 亚洲国产黄色| 国产女精品视频网站免费| 欧美国产精品日韩| 欧美亚洲在线观看| 日韩视频免费观看高清在线视频 | 久久精品视频播放| 一区二区免费在线视频| 国语自产精品视频在线看8查询8 | 国内欧美视频一区二区| 欧美日韩精品三区| 久久久青草青青国产亚洲免观| 亚洲图片欧洲图片av| **性色生活片久久毛片| 国产精品视频第一区| 欧美激情一区二区久久久| 久久gogo国模裸体人体| 一区二区三区精品久久久| 亚洲第一精品福利| 国产欧美一区在线| 欧美日韩综合一区| 久色成人在线| 久久精品国产99| 亚洲一区影音先锋| 亚洲精品综合| 亚洲第一成人在线| 国产亚洲精品aa午夜观看| 欧美日韩中文字幕精品| 你懂的视频欧美| 久久久久欧美精品| 欧美一区二区在线| 亚洲夜间福利| 日韩亚洲综合在线| 亚洲国产视频一区| 狠狠色噜噜狠狠色综合久 | 日韩香蕉视频| 亚洲国产高清一区| 原创国产精品91| 国产一区二区三区在线观看精品| 国产精品久久久久久超碰| 欧美久久久久免费| 欧美gay视频| 老色鬼精品视频在线观看播放| 久久激情视频| 欧美一区久久| 午夜伦欧美伦电影理论片| 亚洲午夜免费视频| 一本久久综合亚洲鲁鲁五月天| 91久久极品少妇xxxxⅹ软件| 尤物九九久久国产精品的分类| 国产专区欧美精品| 国产婷婷一区二区| 国产日韩欧美另类| 国产精品一区久久| 国产精品夜夜嗨| 国产目拍亚洲精品99久久精品| 国产精品美女在线| 国产九色精品成人porny| 国产精品伊人日日| 国产欧美另类| 国产亚洲欧美日韩日本| 国产视频欧美视频| 国产亚洲一区二区三区在线播放| 国产欧美日韩综合一区在线播放| 国产精品一区二区久激情瑜伽| 国产精品捆绑调教| 国产精品日韩欧美综合| 国产精品在线看|