1. 程式人生 > >列舉類&&註解&&反射

列舉類&&註解&&反射

什麼是列舉類?

列舉類是優化定義固定物件的一種特殊的類。

換句話說,在需要類的例項為一個或者多個並且相對固定的時候,使用列舉類。(列舉類可擴充套件)


類的例項相對來說固定的有日期,客觀不變的一些數字等等。

enum WorkDay
{
    MONDAY, THUEDAY, WEDNESDAY , THURSDAY , FRIDAY;
}


public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");

        WorkDay workDay;

        workDay=WorkDay.MONDAY;   //WorkDay例項化的workday值限定在週一到週五之間

//      workDay=3;     //編譯報錯

        WorkDay []workDays = WorkDay.values();  //返回列舉型別的物件陣列

        for(int i =0;i<workDays.length;i++)
        {
            System.out.println(workDays[i]);
        }



        /**
         * 單例模式是列舉類的特例,單例模式的要求是一個類只能由一個例項物件。
         * 列舉類的使用是定義類時固定其一個或多個物件
         *
         * 列舉類的特點:
         *  - 型別安全(列舉類的定義就是固定的)
         *  - 列舉類的物件自動新增private static final
         *  - 某種程度的解耦,列舉類可以加一組常量或者物件抽離出主程式,減小類之間的耦合性。在列舉類模板的擴充套件上也更加容易
         */

    }
}

註解

Annotation 其實就是程式碼裡的特殊標記, 這些標記可以在編譯, 類加 載, 執行時被讀取, 並執行相應的處理。

註解本質是一個介面和一組鍵值對,通過反射和代理實現某種行為。


【框架 = 註解 + 反射 + 設計模式。】

/**
 * @author shkstart
 * @version 1.0
 *
 */
public class Main {
    /**
     * 程式的主方法,程式的入口
     * @param args String[] 命令列引數
     */

    @SuppressWarnings("unused")  //抑制編譯器警告
    int a = 10;

    @Deprecated     //用於表示所修飾的元素(類, 方法等)已過時。通常是因為所修飾的結構危險或存在更好的選擇
    public void print(){
        System.out.println("過時的方法");
    }
    @Override       //限定重寫父類方法, 該註解只能用於方法
    public String toString() {
        return "重寫的toString方法()"; }
    public static void main(String[] args) {
    }
    /**
     * 求圓面積的方法
     * @param radius double 半徑值
     * @return double 圓的面積
     */
    public static double getArea(double radius){
        return Math.PI * radius * radius; }
}

反射

什麼是反射?

反射機制允許程式在執行期 藉助於Reflection API取得任何類的內部資訊,並能直接操作任意物件的內部屬性及方法。 (最高許可權)



Object類

package java.lang;

public class Object {

   private static native void registerNatives();
    static {
        registerNatives();
    }


    public final native Class<?> getClass();

    public native int hashCode();

    public boolean equals(Object obj) {
        return (this == obj);
    }

    protected native Object clone() throws CloneNotSupportedException;


    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }


    public final native void notify();


    public final native void notifyAll();


    public final native void wait(long timeout) throws InterruptedException;

 
    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }

    
 
    public final void wait() throws InterruptedException {
        wait(0);
    }


    protected void finalize() throws Throwable { }
}

其中有一個這樣的方法

public final native Class<?> getClass();


獲取Class類的例項

  • 若已知具體的類,通過類的class屬性獲取,該方法最為安全可靠, 程式效能最高

  • 已知某個類的例項,呼叫該例項的getClass()方法獲取Class物件

  • 已知一個類的全類名,且該類在類路徑下,可通過Class類的靜態方 法forName()獲取,可能丟擲ClassNotFoundException

    Class test  = String.class;
    
    
    Class test01 = "Hello World!".getClass();
    
    
    Class test02 = Class.forName("java.lang.String");  //拋異常

所有的類都繼承Object,所以String.class返回類的例項。

Class類裡有一個forName的方法,返回值也為Class:

獲取類的資訊,呼叫類的屬性及方法

package test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Work {
    private String name;
    private Integer age;
    private String gender;
    private String job;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "Work{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", job='" + job + '\'' +
                '}';
    }
}


public class ReflectWork
{

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {


        Class classWork = Class.forName("test.Work");


        System.out.println(" ///獲取所有方法資訊"
        );


        Method []methods= classWork.getDeclaredMethods();

        for (Method m:methods) {
            System.out.println(m.toString());

        }

        System.out.println("  //獲取所有成員屬性資訊");

        Field[] field=classWork.getDeclaredFields();
        for(Field f:field){
            System.out.println(f.toString());

            f.setAccessible(true);  //取消類的私有屬性的訪問許可權控制

            System.out.println(f.getName().toString());
        }


        System.out.println("//通過反射初始化");
        Work reflectWork = (Work) classWork.newInstance();
        reflectWork.setAge(22);
        reflectWork.setJob("Dev");
        Work work = reflectWork;

        System.out.println(work);




    }
}

相關推薦

列舉&amp;&amp;註解&amp;&amp;反射

什麼是列舉類? 列舉類是優化定義固定物件的一種特殊的類。 換句話說,在需要類的例項為一個或者多個並且相對固定的時候,使用列舉類。(列舉類可擴充套件) 類的例項相對來說固定的有日期,客觀不變的一些數字等等。 enum WorkDay { MONDAY, THUEDAY, WEDNESDAY , THU

java學習筆記(十)-- java新特性 (列舉 &amp; 註解 &amp; 介面定義加強 &amp; Lambda表示式)

列舉 (enum) 高階的多例模式 java中列舉使用enum關鍵字定義列舉 列舉就是一種多例設計模式 enmu Color{     RED,BLUE,GREEN;     } enum Color{

TypeError: Error #1034: 強制轉換型失敗:無法將 &amp;quot;&amp;quot; 轉換為 Array。

soft tom cdata rtc project pan urn provide component 1、錯誤描寫敘述 TypeError: Error #1034: 強制轉換類型失敗:無法將 "" 轉換為 Array。 at mx.charts.series:

python開發基礎:三元運算&amp;生成式&amp;成員運算&amp;解壓法&amp;隊列堆棧&amp;數據型轉換

rate range usr 出棧 遍歷 num print 元組 not in 一,三元運算&生成式&成員運算&解壓法&隊列堆棧&數據類型轉換,都在一個code裏 1 #!/usr/bin/env python 2 #_*

::的名前有個 &amp; ,什麽意思?

logs pan nat div www per class osi 類名 轉載自 http://www.imooc.com/qadetail/93985 MazePerson &MazePerson::setPersonPosition(int coordi

PHP 變量型的強制轉換 &amp; 創建空對象

bsp font foo ble cnblogs code 布爾型 col 類型強制轉換 PHP 在變量定義中不需要(或不支持)明示的類型定義;變量類型是根據使用該變量的上下文所決定的。 也就是說,如果把一個字符串值賦給變量 var,var 就成了一個字符串。如果又把一個整

2017年11月4日 vs和結構的區別&amp;哈希表&amp;隊列集合&amp;棧集合&amp;函數

b- protect htable private turn queue ole 長度 ack 類和結構的區別 類:類是引用類型在堆上分配,類的實例進行賦值只是復制了引用,都指向同一段實際對象分配的內存類有構造和析構函數類可以繼承和被繼承結構:結構是值類型在棧上分配(雖然

Spring---AOP註解開發&amp;jdbc模板&amp;Spring事務管理

use oca update -m spl pub tex com att 一、AOP註解開發   此處需要回憶一遍AOP的概念。簡單的來說,AOP就是利用動態代理技術,做到不觸動源代碼但卻擴展了功能。那麽就需要一個被擴展的對象和一個“新的功能”,例如說給某類的saveUs

MD5加密解密(asp.net)&amp;使用MD5過時處理

bytes div height crypt then .text ble tco doc 加密類 #region ========加密======== /// <summary> /// 加密 /// </summary> /

Cygwin(UNIX模擬環境)&amp;CURL(強大的http命令列工具)

前言: 需要我用curl試下能否傳送post請求調起公司的模擬系統(目前) 跟著大佬的腳步,親測一把~ 感謝大佬的提供的部落格和指導 @咩神  個人部落格園及來源地址 Cygwin(類UNIX模擬環境) 一個可以讓你在windows下玩轉linux命令的工具 Cygwin官網下載安裝包:http

【Java篇03】具體 &amp; 抽象 &amp; 介面 —— 繼承extends &amp; 實現Implement小結

一、具體類 & 抽象類 $ 介面 從組成上來看: 具體類包含:屬性、構造器、具體方法、初始化塊(靜態語句塊static{ } 、動態語句塊{ })、內部類 ; 抽象類包含:屬性、構造器、具體方法、抽象方法(需要用public abstract修飾); 介面包含:屬性、抽象方法(一

C++和物件(一)&amp;&amp;實現OFFSETOF巨集&amp;&amp;THIS指標

一.目錄   1.物件的相關知識   2.類的定義   3.類的例項化   4.類物件模型   5.模擬實現offsetof巨集   6.this指標 二.正文 1.物件的相關知識   C語言是面向過程的,關注的是過程,分析求解問題的步驟,通過函式呼叫逐步解決問題

spring事物(2)-----手寫spring註解事務&amp;&amp;事務傳播行為

一,spring事務的註解 1.1,spring自帶的@Transactional例子   package com.qingruihappy1.dao; import org.springframework.beans.factory.annotation.Autowired; imp

SpringMVC框架(1)之(1.3 註解開發&amp;Controller方法返回值)

一、 註解開發基礎: 1. @RequestMapping 註解(在Controller類上或方法上,用於指定 url和請求方式): 1. 設定方法對應的URL(一個方法對應一個URL); 2. 設定請求的根路徑;(eg:http:// localhost:8080/project/bo

Spring Boot @PropertySource&amp;@ImportResource&amp;@Bean註解

一[email protected]:載入指定的配置檔案 例如:載入person.properties person.properties內容: person.last-name=李四 person.age=18 person.birth=2019/01/07 perso

解決QT:forward declaration of &amp;#39;struct Ui::xxx&amp;#39;;invalid use of incomplete struct &amp;quot;Ui::Widget&amp;quot; 等莫名奇異錯誤

執行 center dex text nco jsb ims complete class 今天在進行QT Widget的UI設計時,改了下Widget的對象名,然後在多次成功編譯執行後,執行清理,又一次構建,就出現了好多莫名奇異的錯誤: widget.

IOS開發——手勢 &amp;amp; 傳感器 &amp;amp; 物理引擎

github上 content 物理 alt img .net amp 技術分享 lan 這次思維導圖比較雜,demo已經所有上傳到github上,小編的github地址是:狂戳 先看下效果圖: 手勢畫板: 物理引擎: 傳感器: IOS開發——手

小胖說事31------iOS 真機編譯錯誤&amp;quot;“XXX”的 iPod&amp;quot; and run &amp;quot;XXX&amp;quot; again, or if &amp;quot;XXX&amp;quot; is still running

是不是 col ont lec bug div attach tracking 進程關閉 在真機上測試時用一會就出現例如以下信息,且應用掛掉。 Restore the connection to "“XXX”的 iPod" and run "XXX" again, o

『TensorFlow』隊列&amp;多線程&amp;TFRecod文件_我輩當高歌

gradient 函數 http who epo variable nbsp 其他 新建 TF數據讀取隊列機制詳解 TFR文件多線程隊列讀寫操作: TFRecod文件寫入操作: import tensorflow as tf def _in

atitit.js&amp;#160;與c#&amp;#160;java交互html5化的原理與總結.doc

pad 托管 works onclick rgb sar com 2.0 swing atitit.js 與c# java交互html5化的原理與總結.doc 1. 實現html5化界面的要解決的策略 1 1.1. Js交互 1 1.2. 動態參數個