欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1.通過反射訪問構(gòu)造器

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");
       //無參構(gòu)造器創(chuàng)建實(shí)例
       Object o2 = cls.newInstance();
       System.out.println(o2);
       //訪問公有帶參構(gòu)造器
       Constructor constructor = cls.getConstructor(String.class);
       Object o = constructor.newInstance("AAA");
       System.out.println(o);
       //訪問私有的有參構(gòu)造器
       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;

   //無參構(gòu)造
   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. 訪問無參 必須帶無參構(gòu)造器
        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);
        //調(diào)用的時(shí)候一定帶上屬性
        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 +
                '}';
    }
}

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

相關(guān)文章

  • java 中enum的使用方法詳解

    java 中enum的使用方法詳解

    這篇文章主要介紹了java 中enum的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,理解掌握java 中enum的使用方法,需要的朋友可以參考下
    2017-09-09
  • 詳解java枚舉用法及實(shí)例

    詳解java枚舉用法及實(shí)例

    這篇文章主要介紹了Java枚舉詳解及使用實(shí)例,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2017-04-04
  • Java 關(guān)于遞歸的調(diào)用機(jī)制精細(xì)解讀

    Java 關(guān)于遞歸的調(diào)用機(jī)制精細(xì)解讀

    關(guān)于遞歸是什么,簡(jiǎn)單的說: 遞歸就是方法自己調(diào)用自己,每次調(diào)用時(shí) 傳入不同的變量.遞歸有助于編程者解決復(fù)雜的問題,同時(shí)可以讓代碼變得簡(jiǎn)潔
    2021-10-10
  • Apache Calcite進(jìn)行SQL解析(java代碼實(shí)例)

    Apache Calcite進(jìn)行SQL解析(java代碼實(shí)例)

    Calcite是一款開源SQL解析工具, 可以將各種SQL語句解析成抽象語法樹AST(Abstract Syntax Tree), 之后通過操作AST就可以把SQL中所要表達(dá)的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過代碼實(shí)例給大家介紹Apache Calcite進(jìn)行SQL解析問題,感興趣的朋友一起看看吧
    2022-01-01
  • java中的JSONP使用實(shí)例詳解

    java中的JSONP使用實(shí)例詳解

    json和JSONP這二者在開發(fā)中還是很常見的,本文重點(diǎn)給大家介紹下java中的jsonp使用實(shí)例詳解,需要的朋友參考下
    2017-04-04
  • 關(guān)于JSCH使用自定義連接池的說明

    關(guān)于JSCH使用自定義連接池的說明

    這篇文章主要介紹了關(guān)于JSCH使用自定義連接池的說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 一篇文章帶你了解Java Spring基礎(chǔ)與IOC

    一篇文章帶你了解Java Spring基礎(chǔ)與IOC

    這篇文章主要介紹了Java Spring基礎(chǔ)與IOC,文中講解的相關(guān)內(nèi)容非常詳細(xì),也運(yùn)用了大量的代碼進(jìn)行講解,感興趣的小伙伴可以參考一下
    2021-08-08
  • Java異常(Exception)處理以及常見異??偨Y(jié)

    Java異常(Exception)處理以及常見異??偨Y(jié)

    在《Java編程思想》中這樣定義異常,阻止當(dāng)前方法或作用域繼續(xù)執(zhí)行的問題,雖然java中有異常處理機(jī)制,但是要明確一點(diǎn),決不應(yīng)該用"正常"的態(tài)度來看待異常,這篇文章主要給大家介紹了關(guān)于Java異常(Exception)處理以及常見異常的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • springboot自定義攔截器的方法

    springboot自定義攔截器的方法

    這篇文章主要為大家詳細(xì)介紹了springboot自定義攔截器的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢

    使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢

    這篇文章主要介紹了使用AOP+反射實(shí)現(xiàn)自定義Mybatis多表關(guān)聯(lián),目前的需求是增強(qiáng)現(xiàn)有的查詢,使用簡(jiǎn)單的注解即可實(shí)現(xiàn)多表關(guān)聯(lián),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論