java什么是权限控制 什么是Java类的访问权限
今天给各位分享java什么是权限控制的知识,其中也会对什么是Java类的访问权限进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
什么是Java类的访问权限
在解释访问权限控制之前,先看一个场景。
在学生信息管理系统中,有两个类,分别是学生类和课程类,课程类提供了课程表和课程安排两个方法,学生类可以调用课程类提供的课程表查看课程安排,但不能调用课程安排方法,该如何处理,此时就可以利用访问权限来进行控制。
在Java中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private以及protected。
默认访问权限(default):即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
private:对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
protect:介于public和 private之间的一种访问修饰符,一般称之为“保护的”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。下表列出了四种访问权限的控制粒度:
例1:
Main.java:
packagecom.cxh.test1;
publicclassMain{
/**
*@paramargs*/
publicstaticvoidmain(String[]args)
{
//TODOAuto-generatedmethodstub
Peoplepeople=newPeople("Tom");
System.out.println(people.getName());
}
}
People.java
packagecom.cxh.test1;
classPeople{//默认访问权限(包访问权限)
privateStringname=null;
publicPeople(Stringname)
{
this.name=name;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
}
从代码可以看出,修饰People类采用的是默认访问权限,而由于People类和Main类在同一个包中,因此People类对于Main类是可见的。
Java中的四种访问控制域是什么
所谓访问控制域其实就是访问权限.
访问权限的等级最大到最小依次是:public,protected,包访问权限(无关键字)和private。
成员的访问权限取得对某成员(属性和方法)的实现方法有下面四种情况
1,权限设置为public; 2,默认包访问权限,在同一包中的其他类,可以访问; 3,权限设置为public或者protected,通过继承的子类可以访问; 4,设置为private,提供访问器和变异器方法(get/set);
下面介绍这四种权限(相对成员而言)
1,包访问权限,在同一包中的类可以访问; 2, Public:接口访问权限,任何类都可以访问; 3, Private:你无法访问,除了包含该成员的类,其他类都可以访问。 4, Protected:继承访问权限,包括包访问权限。在同一包中,还有就是子类可以访问。
类的访问权限类的访问
只有两种:包访问权限或public(用法同上)如果不希望其他类拥有该类的访问权限,可以把这个来说有的构造器制定为private(比如单列模式)。
Java访问控制权限有哪些
java中成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private。
Public:权限最大,允许所有类访问,但其他包下的类想要访问需使用import关键字将这些public类导入包中才可使用,换句话说,import将不同包的类导入到一个包下,从而转化为包访问权限下的情况。
Protected:除了提供包访问权限以外,还对继承该类的所有派生类赋予访问权限。
Private:权限最小,只能由包含该成员(域和方法)的类本身访问,其他任何类都无法访问。
不使用这三个关键词时,则提供默认包访问权限,该权限只允许同一个包下(即同一个目录下的Java文件)的类访问该类。
注意:private和protected只能修饰成员,无法修饰类。类要么是public的,要么是包访问权限。
java如何做权限管理
首先介绍下思路:
1、用户表 user;
2、角色表 role;
3、菜单 menu;
4、角色菜单权限表 role_menu;
5、用户菜单权限表 user_menu;
如图:
根据用户角色取出该角色所有权限,并对用户进行权限分配;注意菜单的按钮(新增、删除、修改)权限是放在中间表(user_menu)中的;
1、新增用户时,是要根据用户角色进行分配权限的一定记得批量添加;批量、批量、批量,重要的事情说三遍,不要查询角色权限,然后for循环,这样效率太低了;
SQL如下:
INSERT INTO sys_user_menu(UserId, MenuId, DelPower, UpdPower, InsPower, ViewPower)
SELECT#{userId} UserId, MenuId, 1 DelPower, 1 UpdPower, 1 InsPower, 1 ViewPower FROM sys_role_menu WHERE RoelId=#{roleId}
updPower默认都是有的所以都是1,这样根据角色查询出权限直接添加,响应时间大大提升;
2、修改用户角色也要记得重新分配用户权限哦!这个不能忘,可以用上面的方法;
业务方法:
如果角色没有修改,是不用重新分配权限的,所有userRole重置为 null,如果角色修改则删除原权限,重新进行分配;
3、最后要优化的就是根据用户查询权限的时候啦,我最开始是这样做的,查询角色权限,用户权限,返回到前端,前端进行处理;结果就是很卡基本上要三到四秒,
解决方案,一步到位;一个查询返回全部数据。
如下SQL:
SELECT menu.MenuId id, ParentId pid, MenuName text,
(SELECT COUNT(1) FROM sys_user_menu WHERE UserId=#{userId} AND MenuId= sm.MenuId) isShow,
(SELECT CONCAT(
(CASE WHEN smenu.InsPower= 1 THEN 1 ELSE 0 END),',',
(CASE WHEN smenu.DelPower= 1 THEN 1 ELSE 0 END),',',
(CASE WHEN smenu.UpdPower= 1 THEN 1 ELSE 0 END),',',
(CASE WHEN smenu.ViewPower= 1 THEN 1 ELSE 0 END))
FROM sys_user_menu smenu WHERE smenu.UserId=#{userId}
AND smenu.MenuId= sm.MenuId) MenuInfo
FROM sys_role_menu sm INNER JOIN sys_menu menu on sm.MenuId= menu.MenuId
WHERE RoelId=#{roleId}
首先根据角色ID查询出权限,然后子查询用户是否有该权限,有返回1木用返回 0;
最后按钮权限我是直接拼接成字符串,分别对应添加、删除、修改、查看 1有该按钮 0没有该按钮;
优化后不管是添加、修改用户,加载用户权限都能控制在 1~2秒;
关于本次java什么是权限控制和什么是Java类的访问权限的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。