中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

電商網(wǎng)站界面規(guī)范seo優(yōu)化標題 關鍵詞

電商網(wǎng)站界面規(guī)范,seo優(yōu)化標題 關鍵詞,成都網(wǎng)站建設十強企業(yè),做公眾號還是網(wǎng)站目錄 1 單元測試1.1 單元測試概述1.2 單元測試快速入門1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 獲取類對象2.3 獲取構造器對象2.4 獲取成員變量對象2.5 獲取常用方法對象2.6 反射的作用2.6.1 繞過編譯階段為集合添加數(shù)據(jù)2.6.2 通用框架的底層原理 1 單元測試 1.1 單元測試概…

目錄

  • 1 單元測試
    • 1.1 單元測試概述
    • 1.2 單元測試快速入門
    • 1.3 JUnit 常用注解
  • 2 反射
    • 2.1 反射概述
    • 2.2 獲取類對象
    • 2.3 獲取構造器對象
    • 2.4 獲取成員變量對象
    • 2.5 獲取常用方法對象
    • 2.6 反射的作用
      • 2.6.1 繞過編譯階段為集合添加數(shù)據(jù)
      • 2.6.2 通用框架的底層原理

1 單元測試

1.1 單元測試概述


開發(fā)好的系統(tǒng)中存在很多方法,如何對這些方法進行測試?
以前我們都是將代碼全部寫完再進行測試。其實這樣并不是很好。在以后工作的時候,都是寫完一部分代碼,就測試一部分。這樣,代碼中的問題可以得到及時修復。也避免了由于代碼過多,從而無法準確定位到錯誤的代碼。

單元測試就是針對最小的功能單元編寫測試代碼, Java 程序最小的功能單元是 方法,因此,單元測試就是針對 Java 方法的測試,進而檢查方法的正確性。

JUnit 是使用 Java 語言實現(xiàn)的單元測試框架,它是開源的, Java 開發(fā)者都應當學習并使用 JUnit 編寫單元測試。此外,幾乎所有的 IDE 工具都集成了 JUnit,這樣我們就可以直接在 IDE 中編寫并運行 JUnit測試。

JUnit優(yōu)點:

  • 可以靈活的選擇執(zhí)行哪些測試方法,也可以一鍵執(zhí)行全部測試方法
  • 可以生成全部方法的測試報告,如果測試良好則是綠色;如果測試失敗,則變成紅色
  • 單元測試中的某個方法測試失敗了,不會影響其他測試方法的測試

1.2 單元測試快速入門


需求:使用單元測試進行業(yè)務方法預期結果、正確性測試的快速入門

分析:

  • JUnit 的 jar 包導入到項目中
    • IDEA 通常整合好了 JUnit 框架,一般不需要導入。
    • 如果 IDEA 沒有整合好,需要自己手工導入如下 2 個 JUnit 的 jar 包到模塊
  • 編寫測試方法:該測試方法必須是公共的無參數(shù)無返回值的非靜態(tài)方法。
  • 在測試方法上使用 @Test 注解:標注該方法是一個測試方法
  • 在測試方法中完成被測試方法的預期正確性測試。
  • 選中測試方法,選擇JUnit 運行 ,如果測試良好則是綠色;如果測試失敗,則是紅色

示例代碼

要測試的方法

public class UserService {public String login(String name,String passwd){if ("admin".equals(name) && "123456".equals(passwd)){return "登陸成功";}else{return "用戶名或密碼錯誤!";}}public void selectNames(){
//        System.out.println(10/0);System.out.println("查詢全部用戶成功!");}
}

測試方法

import org.junit.Assert;
import org.junit.Test;public class TestUserService {// 測試方法(公開的無參數(shù)無返回值的非靜態(tài)方法)@Testpublic void testLogin(){UserService userService = new UserService();String rs = userService.login("admin", "123456");// 進行預期結果的正確性測試Assert.assertEquals("您的登錄業(yè)務出現(xiàn)問題","登陸成功",rs);}@Testpublic void testSelectNames(){UserService userService = new UserService();// 要測試的方法沒有返回值,不用斷言userService.selectNames();}
}

一個業(yè)務要對應一個測試方法

1.3 JUnit 常用注解


Junit 4.xxxx 版本

在這里插入圖片描述

Junit 5.xxxx 版本

在這里插入圖片描述

2 反射

2.1 反射概述


反射是指對于任何一個 Class 類,在 " 運行的時候 " 都可以直接得到這個類全部成分。

  • 在運行時 , 可以直接得到這個類的構造器對象: Constructor
  • 在運行時 , 可以直接得到這個類的成員變量對象:Field
  • 在運行時 , 可以直接得到這個類的成員方法對象: Method

這種運行時動態(tài)獲取類信息以及動態(tài)調用類中成分的能力稱為 Java 語言的反射機制
反射的第一步都是先得到編譯后的 Class 類對象,然后就可以得到 Class 的全部成分。

2.2 獲取類對象


獲取 class 對象的有以下三種方式

在這里插入圖片描述

示例代碼

Student

package com.huwei;public class Student {private String name;private int age;public Student() {System.out.println("無參構造器執(zhí)行!");}public Student(String name, int age) {System.out.println("有參構造器執(zhí)行!");this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

測試類

public class Test {public static void main(String[] args) throws ClassNotFoundException {// 1. 通過Class類中的靜態(tài)方法forName("全限名")來獲取Class c = Class.forName("com.huwei.Student");System.out.println(c); // class com.huwei.Student// 2. 通過class屬性來獲取Class c1 = Student.class;System.out.println(c1); // class com.huwei.Student// 3. 利用對象的getClass方法來獲取Student s = new Student();Class c2 = s.getClass();System.out.println(c2); // class com.huwei.Student}
}

注意:

  • 第一種方式forName(String className)中的className為全限名(包名+類名)

已經獲取類對象了,接下來就可以獲取以下對象

在這里插入圖片描述

2.3 獲取構造器對象


Class類中用于獲取構造器的方法

在這里插入圖片描述

示例代碼

import java.lang.reflect.Constructor;public class Test {public static void main(String[] args) throws NoSuchMethodException {// 獲取類對象Class c = Student.class;
//        System.out.println(c); // class com.huwei.Student// 提取類中全部的構造器(只能是公開的構造器)Constructor[] cons1 = c.getConstructors();// 遍歷構造器for (Constructor con : cons1) {System.out.println(con.getName() + "=====>" + con.getParameterCount());}System.out.println("-------------------------------------");// 提取類中全部的構造器,包括私有Constructor[] cons2 = c.getDeclaredConstructors();// 遍歷構造器for (Constructor con : cons2) {System.out.println(con.getName() + "=====>" + con.getParameterCount());}System.out.println("-------------------------------------");// 獲取單個構造器(無參構造器),只能是公開的(如果無參構造器私有會報錯)Constructor con1 = c.getConstructor();System.out.println(con1.getName() + "=====>" + con1.getParameterCount());System.out.println("-------------------------------------");// 獲取單個構造器(無參構造器),包括私有Constructor con2 = c.getDeclaredConstructor();System.out.println(con2.getName() + "=====>" + con2.getParameterCount());System.out.println("-------------------------------------");// 獲取單個構造器(有參構造器),只能是公開的(如果有參構造器私有會報錯)Constructor con3 = c.getConstructor(String.class, int.class);System.out.println(con3.getName() + "=====>" + con3.getParameterCount());System.out.println("-------------------------------------");// 獲取單個構造器(有參構造器),包括私有Constructor con4 = c.getDeclaredConstructor(String.class, int.class);System.out.println(con4.getName() + "=====>" + con4.getParameterCount());}
}

獲取構造器的作用依然是初始化一個對象返回

Constructor類中用于創(chuàng)建對象的方法

在這里插入圖片描述

import java.lang.reflect.Constructor;public class Test2 {public static void main(String[] args) throws Exception{// 獲取類對象Class c = Student.class;// 獲取單個構造器(無參構造器),包括私有Constructor con1 = c.getDeclaredConstructor();System.out.println(con1.getName() + "=====>" + con1.getParameterCount());// 如果遇到了私有構造器,可以暴力反射con1.setAccessible(true); // 權限被打開,僅當前這次Student s1 = (Student) con1.newInstance();System.out.println(s1);System.out.println("--------------------------------");// 獲取單個構造器(有參構造器),包括私有Constructor con2 = c.getDeclaredConstructor(String.class, int.class);System.out.println(con2.getName() + "=====>" + con2.getParameterCount());Student s2 = (Student) con2.newInstance("孫悟空",50000);System.out.println(s2);}
}

如果遇到非 public 的構造器,需要打開權限(暴力反射),然后再創(chuàng)建對象,說明反射可以破壞封裝性,私有的也可以執(zhí)行了

2.4 獲取成員變量對象


Class類中用于獲取成員變量的方法

在這里插入圖片描述

示例代碼

import java.lang.reflect.Field;public class Test3 {public static void main(String[] args) throws NoSuchFieldException {// 獲取類對象Class c = Student.class;// 獲取全部成員變量,包括私有Field[] fields = c.getDeclaredFields();for (Field field : fields) {System.out.println(field.getName()+"=====>"+field.getType());}System.out.println("----------------------");// 獲取某一個成員變量,包括私有
//        Field field = c.getDeclaredField("name");Field field = c.getDeclaredField("age");System.out.println(field.getName()+"=====>"+field.getType());}
}

獲取成員變量的作用依然是在某個對象中取值、賦值

Filed 類中用于取值、賦值的方法

在這里插入圖片描述

示例代碼

import java.lang.reflect.Field;public class Test4 {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {// 獲取類對象Class c = Student.class;// 獲取某一個成員變量,包括私有Field name = c.getDeclaredField("name");name.setAccessible(true); // 暴力打開權限// 賦值Student s = new Student();name.set(s,"小明");System.out.println(s);// 取值String name1 = (String) name.get(s);System.out.println(name1);}
}

2.5 獲取常用方法對象


Class類中用于獲取成員方法的方法

在這里插入圖片描述

獲取成員方法的作用依然是在某個對象中執(zhí)行此方法

Method類中用于觸發(fā)執(zhí)行的方法

在這里插入圖片描述

示例代碼

定義Dog類

public class Dog {private String name;public Dog() {}public Dog(String name) {this.name = name;}public void run(){System.out.println("狗在跑");}public String eat(String name){System.out.println(name+"在吃");return "吃的很開心!";}private void eat(){System.out.println("吃啥");}}

測試類

import java.lang.reflect.Method;public class Test5 {public static void main(String[] args) throws Exception {// 獲取類對象Class c = Dog.class;// 提取全部方法,包括私有Method[] methods = c.getDeclaredMethods();for (Method method : methods) {System.out.println(method.getName() + "=====>" + method.getReturnType() + "====>" + method.getParameterCount());}// 提取單個方法,包括私有Method eat1 = c.getDeclaredMethod("eat"); // 無參的eat方法Method eat2 = c.getDeclaredMethod("eat", String.class); // 有參的eat方法eat1.setAccessible(true); // 暴力反射// 觸發(fā)方法的執(zhí)行Dog d = new Dog();Object rs1 = eat1.invoke(d); // 方法如果是沒有返回值的,則返回的是nullSystem.out.println(rs1);Object rs2 = eat2.invoke(d, "小黑");System.out.println(rs2);}
}

2.6 反射的作用

2.6.1 繞過編譯階段為集合添加數(shù)據(jù)


反射是作用在運行時的技術,此時集合的泛型將不能產生約束了,此時是可以為集合存入其他任意類型的元素的。

泛型只是在編譯階段可以約束集合只能操作某種數(shù)據(jù)類型,在編譯成 Class 文件進入運行階段的時候,其真實類型都是 ArrayList 了,泛型相當于被擦除了。

反射是作用在運行時的技術,此時已經不存在泛型了。

示例代碼

import java.lang.reflect.Method;
import java.util.ArrayList;public class Demo {public static void main(String[] args) throws Exception{ArrayList<String> list1 = new ArrayList<>();ArrayList<Integer> list2 = new ArrayList<>();// 編譯成 Class 文件進入運行階段的時候,泛型會自動擦除。===> ArrayList.classSystem.out.println(list1.getClass()); // class java.util.ArrayListSystem.out.println(list2.getClass()); // class java.util.ArrayListSystem.out.println(list1.getClass() == list2.getClass()); // trueSystem.out.println("=======================================");ArrayList<Integer> list3 = new ArrayList<>();list3.add(11);list3.add(22);
//        list3.add("哈哈哈"); // 報錯Class c = list3.getClass(); // ArrayList.class ===> public boolean add(E e)
//        // 定位c中的add方法Method add = c.getDeclaredMethod("add", Object.class);boolean rs = (boolean)add.invoke(list3, "嘿嘿嘿");System.out.println(rs); // trueSystem.out.println(list3); // [11, 22, 嘿嘿嘿]// 還有一種方法可以突破泛型的限制ArrayList list4 = list3;list4.add("嗚呼啦胡");list4.add(false);System.out.println(list3); // [11, 22, 嘿嘿嘿, 嗚呼啦胡, false]}
}

2.6.2 通用框架的底層原理


反射可以做通用框架

需求:給你任意一個對象,在不清楚對象字段的情況可以,可以把對象的字段名稱和對應值存儲到文件中去。

分析

  • 定義一個方法,可以接收任意類的對象。
  • 每次收到一個對象后,需要解析這個對象的全部成員變量名稱。
  • 這個對象可能是任意的,那么怎么樣才可以知道這個對象的全部成員變量名稱呢?
  • 使用反射獲取對象的 Class 類對象,然后獲取全部成員變量信息。
  • 遍歷成員變量信息,然后提取本成員變量在對象中的具體值
  • 存入成員變量名稱和值到文件中去即可

示例代碼

存在TeacherStudent

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;public class MybatisUtil {/**保存任意類型的對象* @param obj*/public static void save(Object obj){try (PrintStream ps = new PrintStream(new FileOutputStream("reflect/src/data.txt", true));){// 1、提取這個對象的全部成員變量:只有反射可以解決Class c = obj.getClass();  //   c.getSimpleName()獲取當前類名   c.getName獲取全限名:包名+類名ps.println("================" + c.getSimpleName() + "================");// 2、提取它的全部成員變量Field[] fields = c.getDeclaredFields();// 3、獲取成員變量的信息for (Field field : fields) {String name = field.getName();// 提取本成員變量在obj對象中的值(取值)field.setAccessible(true);String value = field.get(obj) + "";ps.println(name  + "=" + value);}} catch (Exception e) {e.printStackTrace();}}
}
/**目標:提供一個通用框架,支持保存所有對象的具體信息。*/
public class ReflectDemo {public static void main(String[] args) throws Exception {Student s = new Student();s.setName("豬八戒");s.setClassName("西天跑路1班");s.setAge(1000);s.setHobby("吃,睡");s.setSex('男');MybatisUtil.save(s);Teacher t = new Teacher();t.setName("波仔");t.setSex('男');t.setSalary(6000);MybatisUtil.save(t);}
}

結果文件

在這里插入圖片描述

http://www.risenshineclean.com/news/22223.html

相關文章:

  • 如何做優(yōu)化網(wǎng)站排名網(wǎng)站關鍵詞優(yōu)化排名怎么做
  • 學做的網(wǎng)站基礎蛋糕線上推廣方案怎么做
  • 視頻下載網(wǎng)站軟件做副屏網(wǎng)絡營銷的宏觀環(huán)境
  • 教育行業(yè)怎么做網(wǎng)站投放吸引人氣的營銷方案
  • 多語種網(wǎng)站制作推廣論壇有哪些
  • 網(wǎng)站系統(tǒng)問題解決措施電子商務網(wǎng)站建設的步驟
  • 鄒城網(wǎng)站制作識圖搜索在線 照片識別
  • 如何選擇靠譜的建站公司網(wǎng)絡服務主要包括
  • 哪個網(wǎng)站做的系統(tǒng)好用石家莊seo推廣優(yōu)化
  • 如何做淘客網(wǎng)站源碼百度云搜索引擎入口官網(wǎng)
  • 2022年免費網(wǎng)站軟件下載seo是什么崗位的縮寫
  • 代碼網(wǎng)站模板怎么做今日頭條荊州新聞
  • 網(wǎng)頁設計與網(wǎng)站建設教材微信營銷的模式有哪些
  • 企業(yè)自建站案例搜索關鍵詞推薦
  • 營業(yè)執(zhí)照辦好了就可以做網(wǎng)站了嗎廣東云浮疫情最新情況
  • 花生殼域名可以做網(wǎng)站域名嗎3322免費域名注冊
  • 平面設計素材網(wǎng)站排名武漢搜索排名提升
  • 購物網(wǎng)站開發(fā)實例網(wǎng)絡服務提供商
  • wordpress多國語言設置淘寶seo是什么意思
  • 網(wǎng)站制作 臺州淘寶代運營1個月多少錢
  • 一個做搞笑類視頻的網(wǎng)站取名seo學習網(wǎng)站
  • 北京it行業(yè)公司排名關于華大18年專注seo服務網(wǎng)站制作應用開發(fā)
  • 怎么用一個主機做多個網(wǎng)站軟文之家
  • 網(wǎng)站建設合同英文版seo 優(yōu)化技術難度大嗎
  • 眉山網(wǎng)站制作最吸引人的引流話術
  • 推廣公司如何賺錢網(wǎng)站優(yōu)化策劃書
  • 做界面的網(wǎng)站12月30日疫情最新消息
  • 南平公司做網(wǎng)站pc網(wǎng)站建設和推廣
  • 文案交流網(wǎng)站免費網(wǎng)站大全下載
  • 2015做哪些網(wǎng)站致富什么是互聯(lián)網(wǎng)營銷