spring容器与java访问权限的关系!

java中的访问控制权限有:

public:无限制 任何人都能访问

protected:只允许在本类中相互调用,还可以由基于父类的子类来调用(即子类可以调用父类中的protected定义的参数或者方法)

默认:默认的权限为同包类调用(即com.xx能调用com包下的其他类,属性和方法,但没法调用com.demo.xx下由默认权限定义的类或者属性或者方法)

private:私有权限,只能在本类中相互调用,不对外开放

public class Dem {

    private Dem () {}

    public static Dem dem () {
        return new Dem();
    }
}

可以将构造方法定义为私有方法,可以控制对象的创建。通过静态方法dem()来创建对象,这样可以防止该类被继承(由于继承的子类会优先调用父类的构造方法).

稍微了解了java的权限控制之后来,突然发现一个问题:

spring容器是通过类的构造方法或者set方法等方式将bean注入到容器中的,那么如果将这些方法都设置为private私有的情况下,spring还能正常的创建对象并存到容器中嘛?

答案是可以的。

自己写了一个简单的测试Demo 将一个类的构造方法定义为private私有的,然后通过@component注解在容器初始化的时候正常被扫描到

发现容器中存在这个bean的对象,说明被正常的创建了。明明是私有的构造方法却能被正常创建。

原因在于Spring源码中的反射无视了java的权限控制。

fields[i].setAccessible(true);  

public void setAccessible(boolean flag) throws SecurityException {
    SecurityManager sm = System.getSecurityManager();    //根据是否设置了系统的安全性来获得访问private的权限
    if (sm != null) sm.checkPermission(ACCESS_PERMISSION);
    setAccessible0(this, flag);
    } 

//当前定义的唯一名称是suppressAccessChecks,它允许取消由反射对象在其使用点上执行的标准 Java 语言访问检查 - 对于 public、default(包)访问、protected、private 成员。
static final private java.security.Permission ACCESS_PERMISSION =
new ReflectPermission("suppressAccessChecks");  

反射在初始化需要的实例时就设置了System.setSecurityManager 系统安全性。

所以当spring在初始话容器的时候通过反射来创建bean的时候其实是忽略了访问权限的限制的!

原文地址:https://www.cnblogs.com/culushitai/p/9044790.html

时间: 2024-10-13 05:03:17

spring容器与java访问权限的关系!的相关文章

java访问权限的问题

java访问权限的问题 java 访问权限 修饰符 背景: 关于java中的四种访问修饰符,public ,default ,protected ,private的作用范围本以为很熟悉了,但碰到了这样一段代码: package pac1; public class Parent { protected int i; protected class Inner{ } } package pac2; import pac1.Parent; public class Child extends Par

java访问权限整理

类实例化成对象之后,可以通过对象加上"."操作符访问和操纵该对象的域和方法,但是这种访问是有限制的,通过public.protected.default(啥都不写).private来控制. 先看一个实验的例子:(不注释表示可以访问,注释掉表示无法访问) package packageA; import packageB.SubB; public class Base { public String publicStr = "publicString"; protec

论Java访问权限控制的重要性

人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说"钱乃身外之物,生不带来死不带去",但我们又都知道"有钱能使鬼推磨". 除去美色和金钱,我认为还有一个,就是读者的认可--"二哥,你的文章真的很棒,我特别喜欢.希望能多多更新Java基础知识,真的是受益良多,就好像是在读王小波的散文,但又学了编程!"--你说,收到读者这样暖暖的评语,还需要美色和金钱?"两者

Java访问权限控制

访问权限控制   java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.protected.包访问权限(没有关键字).private. 包:库单元 包内有一组类,它们在单一名字空间之下被组织在了一起.如果你向导入某个标准库中的类的话,可以使用import关键字.我们之所以要导入,就是要提供一个管理名字空间的机制.所有类成员的名称都是彼此分离的.所以具有相同方法的不同类在程序运行时不会出现错误的.

Java 访问权限控制:你真的了解 protected 关键字吗?

摘要: 在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词:而一个类能否被其他类所访问,取决于该类的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下,包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外).特别地,很多的介绍Java的书籍对protected介绍的比较笼统,常常会对大家造成误解.因此,本文重点揭示了 protected 关键字的内涵和用法,并介绍了一些其他

Java访问权限控制小结

进行访问权限控制的两个原因 第一,可以控制类成员的可见性,使客户程序员只看到应该看到的内容 第二,可以使类的创建者随意改变类内部的工作方式,而不必担心会对客户端程序产生重大影响 四种访问权限 pulic 默认(包权限) protected private 用于域和方法 public表示所有人对本成员都可以访问 默认访问权限表示同一包下的类可以对本成员进行访问,其他包中的则不可以(!默认包) protected用于类的继承中,protected提供包访问权限,同时,子类也对protected成员具

[THINKING IN JAVA]访问权限控制

6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中import: 6.2  JAVA访问权限修饰符 访问权限:public>protected>包访问权限(没有限定词)>private: public:任何类在任何地方均可访问: 默认包:没有声明package并且处于同一目录下,则他们隶属于默认包,处于同一个package下: protec

【java编程思想--学习笔记(二)】访问控制-Java访问权限修饰词

如果不提供任何访问修饰词,则意味着它是"包访问权限". 2.1 包访问权限 包访问权限赋予包内的类相互访问彼此成员的权限. 应该说, 包访问权限为将类群聚在一起的行为提供了意义和理由,即建立包的目的不仅仅是为了分类和区分,更是为了是同一个包内的类可以拥有彼此的代码. 取得对某一成员访问权的途径: 1)该成员的访问修饰词为public. 2)通过不加访问权限修饰词并将目标类放在同一包内的方式. 3)继承.子类可以访问父类的public和protected修饰词的成员,但只有在父子类处于同

java 访问权限控制

java提供四种访问权限: public > protected > 包访问权限(无关键词) > private 包:库单元 对于包访问权限,一个包内的都可以访问. 在eclipse中创建类时如果不创建包,类将会被创建在默认包(default package)中,我一直习惯这样,然而这是一个很不好的做法(= =!)不相关的类应该置于不同的包.因为如果一个包中有两个名字相同的类会产生冲突的. 把不同的类放入不同的包,如果想使用其他包的类,将需要在名字前加上包名.例如ArrayList类在j