反射機制(reflect)

一.反射機制用來描述所有的類
Class 用來類描述類本身
Package 用來描述類所屬的包
Field 用來描述類的屬性
Method 用來描述類的方法
Constructor 用來描述類的構(gòu)造方法
Annotation 用來描述類中的注解
1.如何獲取class
三種方式:
Class clazz=class.forName("包名.類名")
Class clazz=類名.class
xx對象.getClass();object類中的方法
2.常用方法
modifiers();獲取修飾符,0代表默認不寫,1代表public 4.protected ...等等
package reflect;
3.field的常用方法

import java.lang.reflect.Field;
public class test {
    public static void main(String[] args) {
        try {
            Class clazz=Class.forName("reflect.person");
            String name=clazz.getName();//獲取類名
            System.out.println(name);
            String simplename=clazz.getSimpleName();
            System.out.println(simplename);
            Class parClazz=clazz.getSuperclass();//獲取繼承的父類
            Class[] cc=clazz.getInterfaces();//獲取實現(xiàn)的接口
            System.out.println(parClazz.getName());
            Package p=clazz.getPackage();
                    p.getName();
                    //通過反射創(chuàng)建對象;
            try {
                   
                person person=(person) clazz.getDeclaredConstructor().newInstance(); //JDK9推薦這個方法了

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

            try {
                Field field=clazz.getField("name");//獲取屬性
                int mod=field.getModifiers();//獲取修飾符
                Field[] fields=clazz.getFields();//獲取所有的屬性
                Class cl=field.getType();//獲取數(shù)據(jù)類型
                //如上的兩個方法,不能獲取私有的屬性,但是可以獲取繼承的屬性
                Field ff=clazz.getDeclaredField("name");//獲取私有屬性
                ff.setAccessible(true);//表示私有屬性可被操作
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4.獲取類中的方法
Method m=clazz.getMethod("eat")
5.設(shè)計一個方法,傳入字符串,創(chuàng)建對象IOC(Inversion Of Control)控制反轉(zhuǎn) DI(依賴注入)自動注入
屬性,DI是IOC的一個體現(xiàn),先要有IOC;

package reflect;

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

public class CreateObject {
    /**
     * 設(shè)計一個方法,傳入字符串,創(chuàng)建對象
     * IOC思想
     * DI依賴注入
     */
    //是否需要參數(shù)
    //是否需要返回值
    public Object getBean(String className){
        Object object=null;
        try {
                Class clazz=Class.forName(className);
                //創(chuàng)建對象
                  object=clazz.getDeclaredConstructor().newInstance();
                  //這里做一個DI,自動注入屬性
            //通過clazz獲取所有私有屬性---->通過屬性獲取屬性名---->通過屬性名獲取set名
            Field[] fields=clazz.getFields();
            for (Field field:fields) {
               //獲取屬性名
               String fieldName=field.getName();
               //手動拼接字符串,拼接屬性對應(yīng)的set方法名,StringBuilder性能比String拼接好;
                StringBuilder setMethodName=new StringBuilder("set");
                setMethodName.append(fieldName.substring(0,1).toUpperCase());//屬性首字母大寫拼接
                setMethodName.append(fieldName.substring(1));//其余部分拼接
                //獲取field對應(yīng)的屬性類型
                Class fieldType=field.getType();
                //獲取set方法
                Method method=clazz.getMethod(setMethodName.toString(),fieldType);
                String value="";//這個是需要賦的值,是從配置文件或其他地方得來的
                Constructor con=fieldType.getConstructor(String.class);//通過包裝類的String構(gòu)造方法
                method.invoke(object,con.newInstance(value));//將String轉(zhuǎn)成屬性的類型
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容