1. 程式人生 > >java反射class的三種方式,反射建立物件的兩種方式

java反射class的三種方式,反射建立物件的兩種方式

反射中,欲獲取一個類或者呼叫某個類的方法,首先要獲取到該類的 Class 物件。

1、獲取Class物件

在 Java API 中,提供了獲取 Class 類物件的三種方法:

第一種,使用 Class.forName 靜態方法。

前提:已明確類的全路徑名。

第二種,使用 .class 方法。

說明:僅適合在編譯前就已經明確要操作的 Class

第三種,使用類物件的 getClass() 方法。

適合有物件示例的情況下

程式碼示例:

package com.reflection;

/**
 * Created by Liuxd on 2018-08-15.
 */
public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.reflection;

/**
 * Created by Liuxd on 2018-08-15.
 */
public class TestReflection {

    public static void main(String[] args) {
//      第一、通過Class.forName方式
        Class clazz1 = null;
        try {
            clazz1 = Class.forName("com.reflection.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

//      第二、通過物件例項方法獲取物件
        Class clazz2 = User.class;

//      第三、通過Object類的getClass方法
        User user = new User();
        Class clazz3 = user.getClass();

        System.out.println(clazz1);
        System.out.println(clazz2);
        System.out.println(clazz3);
    }
}

2、獲取物件例項

共兩種方法:

2.1、直接用位元組碼檔案獲取對應例項

1

// 呼叫無參構造器 ,若是沒有,則會報異常

Object o = clazz.newInstance();  

2.2、有帶引數的建構函式的類,先獲取到其構造物件,再通過該構造方法類獲取例項:

1

2

3

/ /獲取建構函式類的物件

Constroctor constroctor = clazz.getConstructor(String.class,Integer.class); /

// 使用構造器物件的newInstance方法初始化物件

Object obj = constroctor.newInstance("龍哥", 29); 

程式碼示例:

package com.reflection;

import java.lang.reflect.Constructor;

/**
 * Created by Liuxd on 2018-08-15.
 */
public class TestReflection {

    public static void main(String[] args) {
//      第一、通過Class.forName方式
        Class clazz1 = null;
        try {
            clazz1 = Class.forName("com.reflection.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

//      第二、通過物件例項方法獲取物件
        Class clazz2 = User.class;

//      第三、通過Object類的getClass方法
        User user = new User();
        Class clazz3 = user.getClass();

        System.out.println(clazz1);
        System.out.println(clazz2);
        System.out.println(clazz3);

        User user1 = null;
        try {
             user1 =(User) clazz1.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        user1.setName("終結者");
        user1.setAge(1500);
        System.out.println("user1:"+user1.toString());


        User user2 = null;
        try {
            // 獲取建構函式
            Constructor constroctor = clazz2.getConstructor(String.class,Integer.class);
            // 通過構造器物件的newInstance方法進行物件的初始化
            user2 = (User) constroctor.newInstance("龍哥",29);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("user2:"+user2.toString());

    }
}

相關推薦

java反射class方式反射建立物件方式

反射中,欲獲取一個類或者呼叫某個類的方法,首先要獲取到該類的 Class 物件。 1、獲取Class物件 在 Java API 中,提供了獲取 Class 類物件的三種方法: 第一種,使用 Class.forName 靜態方法。 前提:已明確類的全路徑名。 第二種,

java之執行緒建立方式狀態和匿名內部類建立子類或實現類物件

一.匿名內部類建立子類或實現類物件 new Test(){} 相當於建立了Test類的子類物件 並且沒有類名 建立介面實現類 new 介面名() {};介面實現類的物件 注意 : new 後邊是類或者介面名 大括號內是類或者介面中的方法 public

java基礎增強(泛型反射, 註解日誌)

泛型 作用:異常提前到編譯期 // 執行時期異常 @Test public void testGeneric() throws Exception { // 集合的宣告 List list = new

在思科層交換機配置網關的方式

在思科三層交換機配置網關的兩種方式隨著交換技術的發展,三層交換機在網絡匯聚層與核心層的應用越來越多。在內網中子網與子網之間的通訊越來越少依賴於路由(幾乎見不到了),而是使用帶有路由功能的三層交換機,這對於內網中子網之間的通信效率的提高是顯著的。在三層交換機配置子網之間的通訊有一個關鍵的地方,就是子網網關的配置

Shell簡介:什麽是ShellShell命令的執行方式

shell linuxShell本身是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。作為命令語言,它交互式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變量和參數,並提供了許多在高級語言中

斑馬打印機客戶端GET和POST以及後端打印方式

syn box orm sub make sys jquery 1.2 ace 斑馬打印機客戶端GET和POST,以及後端兩種打印方式。 背景環境:打印機安裝在客戶端外網。當用戶登錄時,通過ajax取服務器數據,返回打印機命令,然後客戶端通過JS發送給斑馬打印機。 1、使用

python制作電腦定時關機辦公神器另含其它方式無需編程!

自動 靜態 自己的 基礎 win src 成功 他會 bsp 小編本人目前就是在電腦面前工作,常常會工作到淩晨兩三點還在為自己的夢想奮鬥著。有時在辦公椅上就稀裏糊塗睡著了,我相信有很多朋友和我一樣,這樣是很不好的。第一對身體不好,第二對電腦不好。 對身體方面,小編也

Java應用部署到SAP雲平臺neo環境的方式

服務器 eclips ges F5 原創 技術文章 cli c2c 平臺 方法1 - 使用Eclipse Eclipse裏新建一個服務器: 服務器類型選擇SAP Cloud Platform: 點Finish,成功創建了一個Server: Eclipse裏選擇要部署

Redis詳解 - SpringBoot整合RedisRedisTemplate和註解方式的使用

本文主要講 Redis 的使用,如何與 SpringBoot 專案整合,如何使用註解方式和 RedisTemplate 方式實現快取。最後會給一個用 Redis 實現分散式鎖,用在秒殺系統中的案例。 更多 Redis 的實際運用場景請關注開源專案 coderiver 專案地址:github.com/cac

Java執行緒建立方式

package test; /**  * 建立執行緒  *  */ public class Demo1 {      public static void main(String arg[]){

POI操作Excel詳解HSSF和XSSF方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor

物件建立方式和閉包的常用場景--js

物件建立的三種方式 ①通過new關鍵字建立物件 var obj = new Object(); obj.name = 'daxue'; obj.age = 28; obj.fun = function(){ } alert(obj.age); ②

Spring中Quartz排程器的使用 ----繼承QuartzJobBean不繼承QuartzJobBean方式

一、Quartz的特點 * 按作業類的繼承方式來分,主要有以下兩種: 1.作業類繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式 2.作業類不繼承org.springframework.schedulin

JS建立物件方式和閉包的常用場景

物件建立的三種方式 ①通過new關鍵字建立物件 var obj = new Object(); obj.name = 'daxue'; obj.age = 28; obj.fun = function(){ } alert(obj.age); ②簡單字面量

java web客戶端整合casweb.xml通過編碼的方式來載入配置

前言: 專案整合cas單點登入,需要在web.xml里加上cas-client的過濾器配置,但是配置地址太繁瑣,而且有重複配置,能不能讓web.xml去讀properties檔案,只做一次配置。在porperties裡配置cas單點開關引數,開就載入cas配置,整合cas,關就不整合。

Java + 原生MongoDB驅動 API 使用案例詳說(方式

前不久,博主利用spring-boot結合spring-data-mongodb包,搞了一把mongodb的整合  -- 增刪改查這種方式,比較固執,使用起來雖然方便,但是太依賴spring,我想建立自己的dbname,都無從下手(可能我還沒探究到),只能使用配置檔案裡面一開

java中byte陣列與int型別的轉換(方式

java中byte陣列與int型別的轉換,在網路程式設計中這個演算法是最基本的演算法,我們都知道,在socket傳輸中,傳送、者接收的資料都是 byte陣列,但是int型別是4個byte組成的,如何把一個整形int轉換成byte陣列,同時如何把一個長度為4的byte陣列轉

SparkStreaming通過Flume獲取資料(單機push和poll方式)的實現

    Flume是Cloudera提供的一個高可用的,高可靠的,分散式的海量日誌採集、聚合和傳輸的系統,Flume支援在日誌系統中定製各類資料傳送方,用於收集資料;同時,Flume提供對資料進行簡單處理,並寫到各種資料接受方(可定製)的能力。1、第一種方式,通過push的方

Jersey使用總結一(jersey初步使用和簡單post請求幾引數傳遞String方式不含物件操作)

首先說明一下,jersey是幹什麼的呢,我個人的理解就是類似於一種webservice技術或框架 jersey-rest為service端,其它的jersey請求為客戶端,客戶端傳送一個請求(帶參或不帶參)呼叫service端的方法,方法返回結果給客戶端。 如以下使用步奏