最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中反射的"暴破"機制(SetAccessible方法)詳解

 更新時間:2022年08月16日 09:19:51   作者:Gao_小豆  
這篇文章主要為大家詳細介紹了Java中反射的"暴破"機制,以及如何利用這一機制實現(xiàn)訪問非公有屬性,方法,和構造器,文中示例代碼講解詳細,感興趣的可以了解一下

通過反射機制去訪問類的屬性,方法,構造器時,可以通過Class 的類的方法直接訪問到對象的公有屬性和私有屬性,類屬性等。當然這肯定違背了對象封裝的意義,所以當通過反射機制去直接訪問非公有屬性,方法,和構造器時,均不能正常運行,如果想要正常執(zhí)行代碼,需要通過反射機制的“暴破”方法,強制進行訪問。

具體的方法就是通過 setAccessible 方法直接設置為true就可以實現(xiàn)暴破。

1.通過反射訪問構造器

package com.java.SetAcc;

import java.lang.reflect.Constructor;

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

       Class cls = Class.forName("com.java.SetAcc.Student");
       //無參構造器創(chuàng)建實例
       Object o2 = cls.newInstance();
       System.out.println(o2);
       //訪問公有帶參構造器
       Constructor constructor = cls.getConstructor(String.class);
       Object o = constructor.newInstance("AAA");
       System.out.println(o);
       //訪問私有的有參構造器
       Constructor constructor1 = cls.getDeclaredConstructor(String.class,int.class);
       //暴破?。。。?
       constructor1.setAccessible(true);
       Object o1 = constructor1.newInstance("bbb",12);
       System.out.println(o1);



   }
}

class Student{
   public String name = "aaa";
   public int age = 10;

   //無參構造
   public Student() {
   }

   public Student(String name){
       this.name = name;
   }

   private Student(String name, int age) {
       this.name = name;
       this.age = age;
   }

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

2.通過反射訪問類的屬性

package com.java.SetAcc;

import java.lang.reflect.Field;

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

        Class<?> cls = Class.forName("com.java.SetAcc.User");
        //1. 訪問無參 必須帶無參構造器
        Object o = cls.newInstance();
        //訪問public的屬性
        Field name = cls.getField("name");
        //可以通過set修改值
        name.set(o,"bbb");
        System.out.println(name.get(o));

        //2.訪問私有屬性
        Field age = cls.getDeclaredField("age");
        //暴破?。?! 直接訪問
        age.setAccessible(true);
        age.set(o,12);
        System.out.println(o);

        //訪問靜態(tài)
        Field salary = cls.getField("salary");
        //可以通過null修改屬性值
        salary.set(null,2000);
        System.out.println(salary.get(null));



    }
}
class User{
    public String name = "aaa";
    private int age = 10;
    public static double salary = 10000;

    public User() {
    }

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

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

3.通過反射訪問類的方法

package com.java.SetAcc;

import java.lang.reflect.Method;

public class ReflectMethod_ {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("com.java.SetAcc.Person");

        Object o = cls.newInstance();
        //公有方法
        Method hi = cls.getMethod("hi", String.class);
        //調用的時候一定帶上屬性
        hi.invoke(o,"aaa");

        //私有方法
        Method hello = cls.getDeclaredMethod("hello", int.class);
        hello.setAccessible(true);
        hello.invoke(o,10);

        //靜態(tài)ff
        Method bye = cls.getDeclaredMethod("bye");
        bye.setAccessible(true);
        bye.invoke(null);




    }
}
class Person{
    public String name;
    public int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void hi(String name){
        System.out.println("hi方法"+name);
    }

    private void hello(int age){
        System.out.println("hello方法"+age);
    }

    static void bye(){
        System.out.println("bye方法");
    }

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

到此這篇關于Java中反射的"暴破"機制(SetAccessible方法)詳解的文章就介紹到這了,更多相關Java反射暴破機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java面試題沖刺第七天--Spring框架1

    Java面試題沖刺第七天--Spring框架1

    這篇文章主要為大家分享了最有價值的三道Spring框架面試題,涵蓋內容全面,包括數(shù)據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java中異常Exception和捕獲以及自定義異常詳解

    Java中異常Exception和捕獲以及自定義異常詳解

    在工作過程中,我們常常需要在合適的地方拋出合適的異常,除了java自帶的一些異常,我們可以在項目中定制自己的異常,并且全局捕獲它,下面這篇文章主要給大家介紹了關于Java中異常Exception和捕獲以及自定義異常的相關資料,需要的朋友可以參考下
    2023-05-05
  • 深入淺出講解Java8函數(shù)式編程

    深入淺出講解Java8函數(shù)式編程

    不管是前端還是后端開發(fā)人員,學習一些函數(shù)式編程的思想和概念,對于手頭的開發(fā)工作和以后的職業(yè)發(fā)展,都是大有裨益的,下面這篇文章主要給大家介紹了關于Java8函數(shù)式編程的相關資料,需要的朋友可以參考下
    2022-01-01
  • 詳解Java集合類之HashSet篇

    詳解Java集合類之HashSet篇

    這篇文章主要為大家詳細介紹一下Java集合類中HashSet的用法,文中的示例代碼講解詳細,對我們學習Java有一定幫助,感興趣的可以了解一下
    2022-07-07
  • SpringBoot模塊多項目解耦的最佳實踐

    SpringBoot模塊多項目解耦的最佳實踐

    為了提高代碼質量和靈活性,在Spring Boot項目中采用策略模式是一個有效的方法,該模式允許定義一系列算法并將每一個封裝起來,使它們可以互相替換,本文給大家介紹了SpringBoot模塊多項目解耦的最佳實踐,需要的朋友可以參考下
    2025-02-02
  • Java整合mybatis實現(xiàn)過濾數(shù)據

    Java整合mybatis實現(xiàn)過濾數(shù)據

    這篇文章主要介紹了Java整合mybatis實現(xiàn)過濾數(shù)據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • java編譯器的基礎知識點

    java編譯器的基礎知識點

    在本篇文章里小編給大家整理的是一篇關于java編譯器的基礎知識點內容,有興趣的朋友們可以閱讀下。
    2020-02-02
  • Java中的線程ThreadLocal詳細解析

    Java中的線程ThreadLocal詳細解析

    這篇文章主要介紹了Java中的線程ThreadLocal詳細解析,ThreadLocal是線程本地變量,存儲在ThreadLocal里面的數(shù)據都是線程安全的,一般ThreadLocal適用的場景多是各個線程間沒有變量共享需要的同步問題場景,需要的朋友可以參考下
    2023-10-10
  • java使用swing繪制國際象棋棋盤

    java使用swing繪制國際象棋棋盤

    這篇文章主要為大家詳細介紹了java使用swing繪制國際象棋棋盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • MybatisX無法自動生成entity實體類的解決方法

    MybatisX無法自動生成entity實體類的解決方法

    本文主要介紹了MybatisX無法自動生成entity實體類的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論

广元市| 花莲县| 九台市| 深圳市| 固安县| 黔东| 九龙城区| 兰溪市| 金华市| 枣强县| 西青区| 同心县| 余干县| 琼中| 绥滨县| 姚安县| 龙州县| 开鲁县| 石渠县| 辽宁省| 湖南省| 宜春市| 新乐市| 宁国市| 平阴县| 黄龙县| 通化县| 镇沅| 郯城县| 紫云| 威远县| 福安市| 云林县| 繁昌县| 长乐市| 高邮市| 昌江| 萝北县| 黄梅县| 弥勒县| 永安市|