搜索
首页Javajava教程Java反射的setAccessible()方法怎么使用

一、 什么是Java的访问检查

访问检查,就是查看成员属性、成员方法的使用是否符合访问权限(public、protected、default、private)。

有点太理论化了,简单来说,如果一个类的成员(属性或者方法)的访问权限是private,那么该成员只能在当前类中使用;如果一个类的成员的访问权限是public,那么该成员可以在任意类中使用;如果一个类的成员的访问权限是default,那么该成员只能在同一个包下面的类中使用;如果一个类的成员的访问权限是protected,那么该成员可以在同一个包下面的类中和其他包下面的该类的子类中使用。

如果,类的成员的访问权限是default,你却在另一个包中使用了该成员,当编译时,编译器会进行访问检查,发现成员的使用与给定的访问权限不一致,因此会报错。

举个例子,在com.example包下创建People类,有四个成员变量。在com.example.app包下(它是不同于com.example的包)下,使用People类的四个成员变量。

package com.example;

package com.example;

public class People {

    private int privateVar = 1;
            int defaultVar = 2;
    protected int protectedVar = 3;
    public int publicVar = 4;
}


package com.example.app;

import com.example.People;
public class TestMain {
    public static void main(String[] args) {
        People p = new People();
        System.out.println(p.privateVar);
        System.out.println(p.defaultVar);
        System.out.println(p.protectedVar);
        System.out.println(p.publicVar);
    }
}

编译后提示,publicVar的使用符合public的访问权限,所以没有出错。

Java反射的setAccessible()方法怎么使用

相信大家都理解了访问检查是什么,那么,反射对象的访问检查是怎么的呢?

一个类的成员属性、成员方法、构造函数,在反射中分别被抽象为Field、Method、Counstructor类。

我们可以使用Field访问对象的成员属性,成员属性的访问权限,编译器是不知道的,只有运行时才知道。因此对于反射对象(例如Field)访问权限的检查只能交给虚拟机。

如果,虚拟机在运行时,发现成员的使用与给定的访问权限不一致,如下代码

package com.example.app;

import com.example.People;
import java.lang.reflect.Field;
public class TestMain {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        People p = new People();
        Class cl = p.getClass();
        
        // 利用反射访问private修饰的成员变量 
        Field f = cl.getDeclaredField("privateVar")
        System.out.println(f.get(p));        
    }
}

运行时,抛出异常:java.lang.IllegalAccessException

Java反射的setAccessible()方法怎么使用

综上,访问检查可以时编译器在编译时进行或者虚拟机在运行时进行(主要是针对反射)

二、 setAccessible() 方法介绍

 setAccessible(boolean flag)方法是AccessibleObject类中的一个方法,它是Field、 Method、Constructor的公共父类。当Field、Method或Constructor (三者都是反射对象)分别用于设置字段(set(Object obj, Object value))或获取字段(get(Object obj))、调用方法(invoke(Object obj, Object... args))或创建和初始化类的新实例(newInstance(Object... initargs))时,将执行运行时访问检查

引用自《Java核心技术 第十版》

Java反射的setAccessible()方法怎么使用

注意:方法名setAccessible很容易让人产生误解,给人的感觉是设置了成员的可访问性,例如,觉得public修饰的成员是任意类都可以访问的,所以可访问标志是true;觉得private修饰的成员只有本类可以访问,所以可访问标志是false。其实不然,不管是什么访问权限,其可访问标志的值都为false。

测试代码如下:

package com.example.app;

import com.example.People;
import java.lang.reflect.Field;
public class TestMain {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        People p = new People();
        Class cl = p.getClass();
        // 打印输出所有成员变量的名字及可访问标志
        for (Field f : cl.getDeclaredFields()) {
            System.out.println(f.getName() + ": " + f.isAccessible());
        }
    }
}

输入结果:

Java反射的setAccessible()方法怎么使用

上面中的API说得很清楚,这个可访问标志表示是否屏蔽Java语言的访问检查默认值是false,(上面已经测试)

可以通过setAccessible(true) 修改默认值,如此会屏蔽Java语言的(运行时)访问检查,使得对象的私有成员可以访问,而不报错。

package com.example.app;

import com.example.People;

import java.lang.reflect.Field;

public class TestMain {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        People p = new People();
        Class cl = p.getClass();

        for (Field f : cl.getDeclaredFields()) {
            //屏蔽对象的访问检查
            f.setAccessible(true);
            // 访问不符合访问权限的成员属性
            System.out.println(f.getName() + " = " + f.get(p));
        }
    }
}

输入结果:

Java反射的setAccessible()方法怎么使用

以上是Java反射的setAccessible()方法怎么使用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
Java平台是否独立,如果如何?Java平台是否独立,如果如何?May 09, 2025 am 12:11 AM

Java是平台独立的,因为其"一次编写,到处运行"的设计理念,依赖于Java虚拟机(JVM)和字节码。1)Java代码编译成字节码,由JVM解释或即时编译在本地运行。2)需要注意库依赖、性能差异和环境配置。3)使用标准库、跨平台测试和版本管理是确保平台独立性的最佳实践。

关于Java平台独立性的真相:真的那么简单吗?关于Java平台独立性的真相:真的那么简单吗?May 09, 2025 am 12:10 AM

Java'splatFormIndenceIsnotsimple; itinvolvesComplexities.1)jvmCompatiblemustbeiblemustbeensurecensuredAcrospPlatForms.2)nativelibrariesandsycallsneedcarefulhandling.3)

Java平台独立性:Web应用程序的优势Java平台独立性:Web应用程序的优势May 09, 2025 am 12:08 AM

Java'splatformindependencebenefitswebapplicationsbyallowingcodetorunonanysystemwithaJVM,simplifyingdeploymentandscaling.Itenables:1)easydeploymentacrossdifferentservers,2)seamlessscalingacrosscloudplatforms,and3)consistentdevelopmenttodeploymentproce

JVM解释:Java虚拟机的综合指南JVM解释:Java虚拟机的综合指南May 09, 2025 am 12:04 AM

thejvmistheruntimeenvorment forexecutingjavabytecode,Cocucialforjava的“ WriteOnce,RunanyWhere”能力

Java的主要功能:为什么它仍然是顶级编程语言Java的主要功能:为什么它仍然是顶级编程语言May 09, 2025 am 12:04 AM

JavaremainsatopchoicefordevelopersduetoitsplatFormentence,对象与方向设计,强度,自动化的MememoryManagement和ComprechensivestAndArdArdArdLibrary

Java平台独立性:这对开发人员意味着什么?Java平台独立性:这对开发人员意味着什么?May 08, 2025 am 12:27 AM

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允许univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

如何为第一次使用设置JVM?如何为第一次使用设置JVM?May 08, 2025 am 12:21 AM

要设置JVM,需按以下步骤进行:1)下载并安装JDK,2)设置环境变量,3)验证安装,4)设置IDE,5)测试运行程序。设置JVM不仅仅是让其工作,还包括优化内存分配、垃圾收集、性能调优和错误处理,以确保最佳运行效果。

如何查看产品的Java平台独立性?如何查看产品的Java平台独立性?May 08, 2025 am 12:12 AM

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用