溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java反射是什么

發(fā)布時(shí)間:2020-10-20 17:38:09 來源:億速云 閱讀:147 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關(guān)Java反射是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

1、Class的簡單介紹

Class類的類表示正在運(yùn)行的Java應(yīng)用程序中的類和接口。 枚舉是一種類,一個(gè)注解是一種接口, 每個(gè)數(shù)組也屬于一個(gè)反映為類對象的類,該對象由具有相同元素類型和維數(shù)的所有數(shù)組共享。 原始Java類型( boolean , byte , char , short , int , long , float和double ),和關(guān)鍵字void也表示為類對象。

摘自jdk1.8中文版,剛開始看可能不懂,現(xiàn)在逐句來解釋一下。

第一句話:一個(gè)類被加載以后,JVM就會(huì)在內(nèi)存中給創(chuàng)建一個(gè)對應(yīng)類的Class對象。

第二句話:類型相同的對象,維數(shù)相同的數(shù)組(不管長度)共享的是同一個(gè)內(nèi)存中的Class對象。

第三句話:上面這些原始的類型,也會(huì)在內(nèi)存中有一個(gè)與之對象的Class對象

package com.dingyu;

import org.junit.Test;

/**
 * Class的簡單使用方法
 * 
 * @author 70241
 *
 */
public class ClassDemo {
    @Test
    public void classTest1() {
        try {
            Class class1 = Class.forName("com.dingyu.User");// 第一種獲取Class對象的方法
            User user = new User();
            Class class2 = user.getClass();// 第二種獲取Class對象的方法
            Class class3=User.class;//第三種獲取Class對象的方法
            System.out.println("接下來判斷到底同一類的不同對象的Class對象是不是同一個(gè):"
                    + (class1.hashCode() == class2.hashCode()&&class1.hashCode() == class3.hashCode()));

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void classTest2() {
        String[] s1 = new String[10];
        String[] s2 = new String[30];
        String[][] s3 = new String[3][30];
        System.out.println(s1.getClass().hashCode()==s2.getClass().hashCode());
        System.out.println(s1.getClass().hashCode()==s3.getClass().hashCode());
        
    }
}

Java反射是什么

Java反射是什么

2.Class獲取類的屬性,構(gòu)造器,方法和注解的簡單使用

package com.dingyu;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

/**
 * Class的簡單用法
 * 
 * @author dingyu
 *
 */
public class ClassDemo02 {

    @Test
    public void usingClass() throws Exception {

        Class userClass = Class.forName("com.dingyu.User");

        // 獲得類名
        System.out.println(userClass.getName());// 獲得全類名
        System.out.println(userClass.getSimpleName());// 獲得類名

        // 獲得屬性
        Field[] fields = userClass.getDeclaredFields();// 獲得所有的屬性
        for (Field field : fields) {
            System.out.println(field.getName());
        }

        System.out.println(userClass.getDeclaredField("id").getName());// 獲得指定的屬性

        // 獲得方法
        Method[] methods = userClass.getDeclaredMethods();// 獲得所有的方法
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        Method method = userClass.getDeclaredMethod("setId", int.class);// 獲得指定的方法,前面方法名,后面方法的參數(shù)
        System.out.println(method.getName());

        // 獲得構(gòu)造器
        Constructor[] constructors = userClass.getDeclaredConstructors();
        System.out.println(constructors.length);
        Constructor constructor = userClass.getDeclaredConstructor(int.class, String.class, int.class);// 獲得指定的構(gòu)造器,需要指定構(gòu)造的參數(shù)
        System.out.println(constructor.getName());

        // 獲得注解
        Annotation[] annotations = userClass.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        // 指定注解名
        MyAnnotation annotation = (MyAnnotation)userClass.getDeclaredAnnotation(MyAnnotation.class);
        System.out.println(annotation);
    }
}

3.Class動(dòng)態(tài)的調(diào)用構(gòu)造器,方法,修改屬性

package com.dingyu;

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

import org.junit.Test;
/**
 * 使用反射動(dòng)態(tài)的調(diào)用構(gòu)造器,方法,修改屬性 
 * @author 70241
 *
 */
public class ClassDemo03 {
    @Test
    @SuppressWarnings("all")
    public void usingClass() throws Exception {
        Class class1 = Class.forName("com.dingyu.User");
        
        //使用反射去調(diào)用構(gòu)造器
        User user1 = (User) class1.newInstance();//調(diào)用的是無參的
        
        Constructor constructor = class1.getDeclaredConstructor(int.class,String.class,int.class);//獲得有參的構(gòu)造器
        User user2 = (User) constructor.newInstance(04,"dingyu",20);//動(dòng)態(tài)生成對象
        
        //使用反射去調(diào)用方法
        Method methodSetId = class1.getDeclaredMethod("setId",int.class);
        methodSetId.invoke(user1, 02);//執(zhí)行user1中的setId,后面是給的參數(shù)
        System.out.println(user1.getId());
        
        //使用反射去修改屬性的值
        Field field = class1.getDeclaredField("age");
        field.setAccessible(true);//因?yàn)閍ge是私有的,加上這句就表示這個(gè)屬性不需要做安全檢查
        field.set(user1, 20);
        System.out.println(field.get(user1));
        System.out.println(user1.getAge());
        
        
        
    }
}

4.反射獲得帶泛型的參數(shù)或返回值里泛型的的類型  

package com.dingyu;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
/**
 * 反射獲得帶泛型的參數(shù)或返回值里泛型的的類型
 * @author dingyu
 *
 */
public class ClassDemo04 {
    public void test01(Map<Integer, String> map, String s) {

    }

    public Map<Integer, String> test02() {
        return null;
    }

    public static void main(String[] args) throws Exception {
        //參數(shù)中帶泛型的
        Method method = ClassDemo04.class.getDeclaredMethod("test01", Map.class, String.class);
        Type[] types = method.getGenericParameterTypes();// 返回一個(gè) Type對象的數(shù)組, Type以聲明順序表示由該對象表示的可執(zhí)行文件的形式參數(shù)類型
        // 打印這些參數(shù)的類型
        for (Type type : types) {
            System.out.println(type.getTypeName());
            if (type instanceof ParameterizedType) {// 如果是泛型的參數(shù)
                Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 獲得泛型的的類型
                for (Type type2 : actualTypeArguments) {
                    System.out.println(type2.getTypeName());
                }
            }
        }
        
        //返回值中帶泛型的
        Method method02 = ClassDemo04.class.getDeclaredMethod("test02");
        Type type = method02.getGenericReturnType();// 返回的類型
        // 打印這些返回的類型            
        System.out.println(type.getTypeName());
        if (type instanceof ParameterizedType) {// 如果是泛型的參數(shù)
            Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();// 獲得泛型的的類型
            for (Type type2 : actualTypeArguments) {
            System.out.println(type2.getTypeName());
            }
        }            
    }

}

感謝各位的閱讀!關(guān)于Java反射是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI