中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java中如何通過反射獲取類的信息

發布時間:2021-02-26 11:08:09 來源:億速云 閱讀:176 作者:清風 欄目:編程語言

這篇文章主要為大家展示了Java中如何通過反射獲取類的信息,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶大家一起來研究并學習一下“Java中如何通過反射獲取類的信息”這篇文章吧。

Java的特點有哪些

Java的特點有哪些 1.Java語言作為靜態面向對象編程語言的代表,實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。 2.Java具有簡單性、面向對象、分布式、安全性、平臺獨立與可移植性、動態性等特點。 3.使用Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。

Java中如何通過反射獲取類的信息

1.獲取Field

public class ReflectTest03 {
    public static void main(String[] args) throws Exception{
        //1.獲取整個類
        Class studentClass=Class.forName("cn.yujie.bean.Student");
        String className=studentClass.getName();
        System.out.println(className);
        System.out.println(studentClass.getSimpleName());

        //獲取類中的所有public的Field
        Field[] fields=studentClass.getFields();
        System.out.println(fields.length);      //測試數組中只有1個元素
        //測試這個field
        Field f=fields[0];
        //取出field的它的名字
        String fieldName=f.getName();
        System.out.println(fieldName);

        //獲取所有的Field
        //獲取所有的Field
        Field[] fs=studentClass.getDeclaredFields();
        System.out.println(fs.length);
        System.out.println("-----------------");
        //遍歷
        for(Field field :fs){
            //獲取屬性的修飾符列表
            //返回的修飾符是一個數字,每個數字是修飾符的代號
            int i=field.getModifiers();
            //可以將這個代號數字轉換成字符串
            String ModifierString = Modifier.toString(i);
            System.out.print(ModifierString+" ");
            //獲取屬性的類型
            Class fieldType=field.getType();
            String fName=fieldType.getSimpleName();
            System.out.print(fName+" ");
            //獲取屬性的名字
            System.out.println(field.getName()+" ");
            System.out.println();
        }
    }}

2.反編譯Field

通過反射機制,反編譯一個類的屬性Field

public class ReflectTest05 {
    public static void main(String[] args) throws Exception{
        //創建這個是為了拼接字符串
        StringBuilder s=new StringBuilder();
        Class studentClass=Class.forName("cn.yujie.bean.Student");
        s.append(Modifier.toString(studentClass.getModifiers())+" class "+studentClass.getSimpleName()+"{");
        Field[] fields=studentClass.getDeclaredFields();
        s.append(";\n");
        for(Field field:fields){
            s.append("\t");
            s.append(Modifier.toString(field.getModifiers()));
            s.append(" ");
            s.append(field.getType().getSimpleName());
            s.append(" ");
            s.append(field.getName());
            s.append(";\n");
        }
        s.append("}");
        System.out.println(s);
    }}

Java中如何通過反射獲取類的信息

3.通過反射機制訪問對象屬性

必須掌握:
怎么通過反射機制訪問一個對象的屬性
給屬性賦值set
獲取屬性的值get

public class ReflectTest07 {
    public static void main(String[] args) throws Exception{

        Class studentClass=Class.forName("cn.yujie.bean.Student");
        //使用反射機制,怎么取訪問一個對象的屬性
        Object obj=studentClass.newInstance();  //obj就是student對象(底層調用無參數構造方法)
        //獲取no屬性(根據屬性的名稱獲取Field)
        Field noFiled=studentClass.getDeclaredField("no");
        //給obj對象(Student對象)的no屬性賦值
        //s.no=111;         //給s對象的no屬性賦值111,三要素,對象,屬性和值
        //雖然使用了反射機制,但是三要素還是缺一不可
        //注意,反射機制讓代碼復雜了,但是為了一個靈活,這也是值得的。
        noFiled.set(obj,222);           //給obj對象的no屬性賦值222
        //讀取屬性的值
        //兩個要素:獲取obj對象no屬性的值
        System.out.println(noFiled.get(obj));
        //可以訪問私有屬性嗎
        Field nameField=studentClass.getDeclaredField("name");
        //打破封裝(反射機制的缺點:打破封裝,可能會給不法分子留下機會)
        nameField.setAccessible(true);
        //給name屬性賦值
        nameField.set(obj,"jackson");
        //獲取name屬性的值
        System.out.println(nameField.get(obj));

    }}

4.可變長度參數

可變長度參數
int… args這就是可變長度參數
語法是:類型…(注意:一定是3個點)

  • 1.可變長度參數要求的參數個數是0-n個

  • 2.可變長度參數在參數列表中必須在最后一個位置上,而且可變長度參數必須只有一個

  • 3.可變長度可以看成一個數組

public class ArgumentsTest {
    public static void main(String[] args) {
      m();
      m(10);
      m(20,40);
      //m("abc");編譯錯誤
      m3("ab","cd","def","de9");
      String [] strs={"a","b","c"};
      m3(strs);
    }
    public static void m(int... args){

    }
    //必須在最后一個,且只有1個//    public static void m2(String... args1,int...args2){////    }
    public static void m3(String ...args){
        //可以將可變長度參數當成一個數組來看
        for(int i=0;i<args.length;i++){
            System.out.println(args[i]);
        }
    }}

5.反射Method(了解)

public class ReflectTest08 {
    public static void main(String[] args) throws Exception{
        //獲取類了
        Class userServiceClass = Class.forName("cn.yujie.service.UserService");
        //獲取所有的Method(包括私有的)
        Method[] methods=userServiceClass.getDeclaredMethods();
        System.out.println(methods.length);         //2
        //遍歷Method
        for(Method method:methods){
            //獲取修飾符列表
            System.out.println(Modifier.toString(method.getModifiers()));
            //獲取方法的返回值類型
            System.out.println(method.getReturnType().getSimpleName());
            //獲取方法名
            System.out.println(method.getName());
            //方法的參數列表(一個方法的參數可能有多個)
            Class[] parameterTypes=method.getParameterTypes();
            for(Class parameterType:parameterTypes){
                System.out.println(parameterType.getSimpleName());
            }
        }

    }}

6.反編譯(了解)

public class ReflectTest09 {
    public static void main(String[] args) throws Exception{
        StringBuilder s=new StringBuilder();
        Class userServiceClass = Class.forName("cn.yujie.service.UserService");
        s.append("public class UserService{ ");
        s.append(Modifier.toString(userServiceClass.getModifiers())+"class "+userServiceClass.getSimpleName()+"{ "+"\n");
        Method[] methods=userServiceClass.getDeclaredMethods();
        for(Method method:methods){
            s.append("\t");
            s.append(Modifier.toString(method.getModifiers()));
            s.append(" ");
            s.append(method.getReturnType().getSimpleName());
            s.append(" ");
            s.append(method.getName());
            s.append("(");
            //參數列表
            Class[] parameterTypes = method.getParameterTypes();
            for(Class parameterType:parameterTypes){
                s.append(parameterType.getSimpleName());
                s.append(",");
            }
            s.append("){}\n");
        }
        //刪除指定下標位置上的字符
        s.deleteCharAt(s.length()-1);
        s.append("}");
        System.out.println(s);
    }}

7.反射機制調用方法

重點:必須掌握,通過反射機制怎么調用一個方法。反射機制讓代碼更具有通用性,將來修改配置文件后,創建的對象不一樣了,調用的方法也不同了,但是java代碼不需要做任何改動,這就是反射的魅力

public class ReflectTest10 {
    public static void main(String[] args) throws Exception{
        //通過反射機制調用方法
        Class userServiceClass = Class.forName("cn.yujie.service.UserService");
        //創建對象
        Object obj=userServiceClass.newInstance();
        //java中有重載,java中通過方法名和形參來區分方法
        Method loginMethod=userServiceClass.getDeclaredMethod("login",String.class,String.class);
        //調用方法
        //調用方法有幾個要素
        //要素1:對象,要素2:方法名,要素3:參數列表,要素4:返回值
        //反射機制中最重要的一個方法:必須記住
        //四要素
        /*
        loginMethod方法,obj對象
        admin,123是參數列表,retValue是返回值
        * */
        Object retValue=loginMethod.invoke(obj,"admin","123");
    }}

8.反射Constructor

public class ReflectTest11 {
    public static void main(String[] args) throws Exception{
        StringBuilder s=new StringBuilder();
        Class vipClass=Class.forName("cn.yujie.bean.Vip");
        s.append(Modifier.toString(vipClass.getModifiers()));
        s.append(" class ");
        s.append(vipClass.getSimpleName());
        s.append("{\n");
        //拼接構造方法
        Constructor[] constructors=vipClass.getDeclaredConstructors();
        for(Constructor constructor:constructors){
            s.append("\t");
            s.append(Modifier.toString(constructor.getModifiers()));
            s.append(" ");
            s.append(vipClass.getSimpleName());
            s.append("(");
            Class[] parameterTypes=constructor.getParameterTypes();
            for(Class parameterType:parameterTypes){
                s.append(parameterType.getSimpleName());
                s.append(",");
            }
            if(parameterTypes.length>0) {
                s.deleteCharAt(s.length() - 1);
            }
            s.append("){}\n");
        }
        s.append("}");
        System.out.println(s);
    }}

9.反射機制調用構造方法

public class ReflectTest12 {
    public static void main(String[] args) throws Exception{
        //使用反射機制怎么創建對象
        Class vipClass=Class.forName("cn.yujie.bean.Vip");
        //調用無參構造方法
        Object obj= vipClass.newInstance();
        //調用有參數構造方法
        //第一步:先獲取到有參數構造方法
        Constructor con=vipClass.getDeclaredConstructor(int.class,String.class,String.class,boolean.class);
        //第二步:調用構造方法new對象
        Object newObj=con.newInstance(110,"jackson","1999-10-11",true);
        System.out.println(newObj);
    }}

Java中如何通過反射獲取類的信息

10.獲取父類和父接口

public class ReflectTest13 {
    public static void main(String[] args) throws Exception {
        //String舉例
        Class stringClass=Class.forName("java.lang.String");
        //獲取String的父類
        Class superClass=stringClass.getSuperclass();
        System.out.println(superClass.getSimpleName());
        //獲取String類實現的所有接口
        Class[] interfaces=stringClass.getInterfaces();
        for(Class in:interfaces){
            System.out.println(in.getName());
        }
    }}

以上就是關于“Java中如何通過反射獲取類的信息”的內容,如果改文章對你有所幫助并覺得寫得不錯,勞請分享給你的好友一起學習新知識,若想了解更多相關知識內容,請多多關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊春市| 衡阳市| 互助| 鄂伦春自治旗| 喀喇沁旗| 张家港市| 吴江市| 平乡县| 鹿泉市| 会同县| 本溪市| 石门县| 鸡泽县| 武城县| 柳州市| 沛县| 荥阳市| 威远县| 当涂县| 和平县| 铜川市| 玉屏| 塔城市| 静乐县| 喀喇沁旗| 龙泉市| 崇义县| 泰宁县| 交城县| 马边| 黄陵县| 甘洛县| 连江县| 玉门市| 钟山县| 定南县| 基隆市| 东安县| 遵化市| 神农架林区| 通榆县|