switch-case 選擇語句
1.Class類
-
Class本身也是一個類
-
Class物件只能由系統建立物件
-
一個載入的類在JVM中只會有一個Class例項
-
一個Class物件對應的是一個載入到JVM中的一個class檔案
-
每個類的例項都會記得自己是由哪個Class例項所生成
-
通過Class可以完整的得到一個類中的所有被載入的結構
@Test
public void test1() throws ClassNotFoundException {
//通過反射獲取類的class物件
Class c1 = Class.forName("com.yl.pojo.User");
System.out.println(c1);
//一個類在記憶體中只有一個Class物件
//一個類被載入後,類的整個結構都會被封裝在Class物件中
Class c2 = Class.forName("com.yl.pojo.User");
System.out.println(c1==c2);
}
2.獲取Class類的例項
//測試Class類的建立方法
@Test
public void test2() throws ClassNotFoundException{
User user = new Student();
System.out.println("這個人是:"+user.name);
//方式一:通過物件獲得
Class c1 = user.getClass();
System.out.println(c1);
//方式二:forName獲得
Class c2 = Class.forName("com.yl.pojo.Student");
//方式三:通過類名.class獲得
Class<Student> c3 = Student.class;//c1 c2 c3是同一個物件
//方式四:基本內建型別的包裝類都有一個Type屬性
Class<Integer> c4 = Integer.TYPE;
System.out.println(c4);//int
//獲得父類型別
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
3.哪些型別可以有Class物件
class、interface、陣列、enum、annotation、基本資料型別、void
只要元素型別和維度一樣,就是同一個Class物件
4.類的載入
什麼時候發生類的初始化:(new一個類和通過反射呼叫才發生)
5.獲取執行時類的完整結構
@Test
public void test4() throws NoSuchFieldException, NoSuchMethodException {
User student = new Student();
Class c1 = student.getClass();
//獲得類的名字
System.out.println(c1.getName());//獲得類名+包名
System.out.println(c1.getSimpleName());//獲得類名
//獲得類的屬性
Field[] fields = c1.getFields();//獲得public屬性,包括父類中的欄位
for (Field field : fields) {
System.out.println(field);
}
Field[] declaredFields = c1.getDeclaredFields();//獲得某個類的所有宣告的欄位,但不包括父類中的欄位
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println(c1.getField("name"));
//獲得類的方法
Method[] methods = c1.getMethods();
for (Method method : methods) {
System.out.println(method);
}
Method[] declaredMethods = c1.getDeclaredMethods();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
Method getName = c1.getMethod("getName", null);
Method setName = c1.getMethod("setName", String.class);
//獲得構造器,同樣可以指定
System.out.println(c1.getConstructors());
System.out.println(c1.getDeclaredConstructors());
}
6.動態建立物件執行方法
@Test
public void test5() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = Class.forName("com.yl.pojo.User");
User user = (User)c1.newInstance();//本質上是呼叫類的無參構造器
System.out.println(user);
//通過構造器建立物件
Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class,String.class);
User user2 = (User) constructor.newInstance("lulu", 1, 18,"女");
System.out.println(user2);
//通過反射呼叫普通方法
Method setGender = c1.getDeclaredMethod("setGender", String.class);
User user3 = (User) c1.newInstance();
setGender.invoke(user3,"男");//invoke:啟用
System.out.println(user3.getGender());
//通過反射操作屬性,不能直接操作私有屬性,需要關閉安全檢測
Field gender = c1.getDeclaredField("gender");//gender是私有欄位
gender.setAccessible(true);//關閉安全檢測
User user4 = (User) c1.newInstance();
gender.set(user4,"女");
System.out.println(user4.getGender());
}
7.通過反射獲取泛型資訊
public void test6(Map<String,User> map, List<User> list){
System.out.println("test6");
}
@Test
public void test7() throws NoSuchMethodException {
Method test6 = myTest.class.getMethod("test6", Map.class, List.class);
//獲得泛型引數
Type[] genericParameterTypes = test6.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
System.out.println("獲得型別"+genericParameterType);
//強轉
if(genericParameterType instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println("真實型別:"+actualTypeArgument);
}
}
}
}
8.反射操作註解
類註解:
package com.yl.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//類名的註解
//target:作用域,retention:獲取級別
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTable{
String value();
}
屬性註解:
package com.yl.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//屬性的註解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyField{
String columnName();
String type();
int length();
}
pojo:
@MyTable("db_User")
public class User {
@MyField(columnName = "id",type = "int",length = 10)
private int id;
@MyField(columnName = "name",type = "varchar",length = 15)
private String name;
@MyField(columnName = "age",type = "int",length = 3)
private int age;
}
測試:
@Test
public void test() throws ClassNotFoundException, NoSuchFieldException {
Class c1 = Class.forName("com.yl.pojo.User");
//通過反射獲得註解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//獲得註解的value的值
MyTable myTable = (MyTable)c1.getAnnotation(MyTable.class);
System.out.println(myTable.value());
Field name = c1.getDeclaredField("name");
MyField annotation = name.getAnnotation(MyField.class);
System.out.println(annotation.columnName());
System.out.println(annotation.type());
System.out.println(annotation.length());
}
相關推薦
switch-case 選擇語句
0. 語句模型 Go 裡的選擇語句模型是這樣的 switch 表示式 { case 表示式1: 程式碼塊 case 表示式2:
C#中的 switch-case 語句
執行過程: 程式執行到switch處,首先將括號中變數或者表示式的值計算出來,然後拿著這個值依次跟每個case後面所帶的值進行匹配,一旦匹配成功,則執行該case所帶的程式碼,執行完成後,遇到break。
Java 基礎分支語句之程式流程控制switch-case
格式: 分支結構之二:switch-case 格式 switch (表示式){ case常量: 執行語句 //break;可省了
人生苦短我學Java-4-if語句邏輯判斷/switch case語句
一、邏輯判斷if語句 1、格式一:if if (條件){ 執行表示式 } 2、格式二:if else
switch case語句用法
一般情況下,判斷語句常用的有if…else,三目運算子,還有switch…case等,根據不同需求使用其判斷語句。
第13講:C# 基本語法 C# switch case語句(黃菊華NET網站開發、C#網站開發、Razor網站開發教程)
技術標籤:NET教程switch case語句 C# switch case語句 C# switch case 語句也是條件語句的一種,與上一節介紹的《C# if else語句》是類似的,但在判斷條件的選擇上會有一些侷限性。 具體的語法形式如下。
Java switch case語句
Java中的switch和case 1.switch case 語句有如下規則: switch 語句中的變數型別可以是: byte、short、int 或者 char。從 Java SE 7 開始,switch 支援字串 String 型別了,同時 case 標籤必須為字串常量或字面量
golang switch case語句 簡介
注意: 1.switch/case 後是一個表示式(即:常量,變數,一個有返回的函式都可以);
JAVA基礎學習——java分支控制結構:switch case語句
switch語句由一個控制表示式和多個case標籤組成。 和if語句不同的是,switch語句後面的控制表示式的資料型別只能是byte、short、char、int四種整數型別;
十一、java版 SpringCloud分散式微服務雲架構之Java switch case 語句
Java switch case 語句 switch case 語句判斷一個變數與一系列值中某個值是否相等,每個值稱為一個分支。
switch case 語句,??運算子
一.switch case 語句 switch 是“開關”的意思,它也是一種“選擇”語句,但它的用法非常簡單。switch 是多分支選擇語句。說得通俗點,多分支就是多個 if。
java 0.9 switch case 語句
switch case 語句 語法: switch(expression){ case value : //語句 break; //可選 case value : //語句
4.13 switch-case語句
switch-case 語句是一種語法結構與 if-else 有所不同的條件分支判斷語句。其語法結構如下。
Java switch case語句
最近在專案中有根據傳入不同的type來進行處理不同業務的需求,所以用到了switch case,而自己又沒有深刻的總結過這方面的程式碼,導致程式碼穿透了,還好自測發現了,不然搞個烏龍。
關於case when語句的報錯問題詳解
前言 在mysql資料庫中,有時候我們會使用到類似if else的判斷操作。那麼mysql中怎麼處理這種需求呢?
Java switch case資料型別原理解析
這篇文章主要介紹了Java switch case資料型別原理解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
Python Switch Case三種實現方法程式碼例項
Python沒有switch語句,只能通過模擬來對應實現: 方法一:使用dictionary **values = {
Python基於字典實現switch case函式呼叫
python中沒有swich..case,若要實現一樣的功能,又不想用if..elif來實現,可以充分利用字典進行實現
分支結構-if-else與switch-case的轉換
根據鍵盤讀取成績輸出成績等級 例:編寫程式:從鍵盤上讀取一個學生成績,存放在變數score中,根據score的值輸出其對應的成績等級。
switch-case 結構
結構: switch(表示式){case(表示式):break;...defualt}說明:1.defualt相當於if-else結構裡的else,根據switch表示式中的值依次匹配各case中的常量,當匹配成功呼叫語句時,仍然繼續向下呼叫同時滿足case的其他語