Java中反射的"暴破"机制(SetAccessible方法)详解

 更新时间:2022年08月16日 09:19:51   作者:Gao_小豆  
这篇文章主要为大家详细介绍了Java中反射的"暴破"机制,以及如何利用这一机制实现访问非公有属性,方法,和构造器,文中示例代码讲解详细,感兴趣的可以了解一下

通过反射机制去访问类的属性,方法,构造器时,可以通过Class 的类的方法直接访问到对象的公有属性和私有属性,类属性等。当然这肯定违背了对象封装的意义,所以当通过反射机制去直接访问非公有属性,方法,和构造器时,均不能正常运行,如果想要正常执行代码,需要通过反射机制的“暴破”方法,强制进行访问。

具体的方法就是通过 setAccessible 方法直接设置为true就可以实现暴破。

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");
       //无参构造器创建实例
       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);

        //访问静态
        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);

        //静态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反射暴破机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java面试题冲刺第七天--Spring框架1

    Java面试题冲刺第七天--Spring框架1

    这篇文章主要为大家分享了最有价值的三道Spring框架面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java中异常Exception和捕获以及自定义异常详解

    Java中异常Exception和捕获以及自定义异常详解

    在工作过程中,我们常常需要在合适的地方抛出合适的异常,除了java自带的一些异常,我们可以在项目中定制自己的异常,并且全局捕获它,下面这篇文章主要给大家介绍了关于Java中异常Exception和捕获以及自定义异常的相关资料,需要的朋友可以参考下
    2023-05-05
  • 深入浅出讲解Java8函数式编程

    深入浅出讲解Java8函数式编程

    不管是前端还是后端开发人员,学习一些函数式编程的思想和概念,对于手头的开发工作和以后的职业发展,都是大有裨益的,下面这篇文章主要给大家介绍了关于Java8函数式编程的相关资料,需要的朋友可以参考下
    2022-01-01
  • 详解Java集合类之HashSet篇

    详解Java集合类之HashSet篇

    这篇文章主要为大家详细介绍一下Java集合类中HashSet的用法,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下
    2022-07-07
  • SpringBoot模块多项目解耦的最佳实践

    SpringBoot模块多项目解耦的最佳实践

    为了提高代码质量和灵活性,在Spring Boot项目中采用策略模式是一个有效的方法,该模式允许定义一系列算法并将每一个封装起来,使它们可以互相替换,本文给大家介绍了SpringBoot模块多项目解耦的最佳实践,需要的朋友可以参考下
    2025-02-02
  • Java整合mybatis实现过滤数据

    Java整合mybatis实现过滤数据

    这篇文章主要介绍了Java整合mybatis实现过滤数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • java编译器的基础知识点

    java编译器的基础知识点

    在本篇文章里小编给大家整理的是一篇关于java编译器的基础知识点内容,有兴趣的朋友们可以阅读下。
    2020-02-02
  • Java中的线程ThreadLocal详细解析

    Java中的线程ThreadLocal详细解析

    这篇文章主要介绍了Java中的线程ThreadLocal详细解析,ThreadLocal是线程本地变量,存储在ThreadLocal里面的数据都是线程安全的,一般ThreadLocal适用的场景多是各个线程间没有变量共享需要的同步问题场景,需要的朋友可以参考下
    2023-10-10
  • java使用swing绘制国际象棋棋盘

    java使用swing绘制国际象棋棋盘

    这篇文章主要为大家详细介绍了java使用swing绘制国际象棋棋盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • MybatisX无法自动生成entity实体类的解决方法

    MybatisX无法自动生成entity实体类的解决方法

    本文主要介绍了MybatisX无法自动生成entity实体类的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论