文档章节

Java 发射setAccessible()原理

l
 lucky-xin
发布于 2016/03/29 13:12
字数 243
阅读 371
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

源码

     * @param  obj  the object the underlying method is invoked from

     * @param  args the arguments used for the method call

     * @return  the result of dispatching the method represented by

     * this object on {@code  obj} with parameters

 @CallerSensitive

    public Object invoke(Object obj, Object... args)

        throws IllegalAccessException, IllegalArgumentException,

           InvocationTargetException

    {

        if (!override) {//如果override为false则进入检查否则跳过

            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {

                Class<?> caller = Reflection.getCallerClass();

                checkAccess(caller, clazz, obj, modifiers);

            }

        }

        MethodAccessor ma = methodAccessor;             // read volatile

        if (ma == null) {

            ma = acquireMethodAccessor();

        }

        return ma.invoke(obj, args);

    }

调用invoke()方法之前会进行检查,而setAccessible(true);则设置override为true从而跳过安全检查源码如下:

public void setAccessible(boolean flag) throws SecurityException {

        SecurityManager sm = System.getSecurityManager();

        if (sm != null) sm.checkPermission(ACCESS_PERMISSION);

        setAccessible0(this, flag);

    }

再看看setAccessible0(this, flag);方法

  /* Check that you aren't exposing java.lang.Class.<init>. */

    private static void setAccessible0(AccessibleObject obj, boolean flag)

        throws SecurityException

    {

        if (obj instanceof Constructor && flag == true) {

            Constructor<?> c = (Constructor<?>)obj;

            if (c.getDeclaringClass() == Class.class) {

                throw new SecurityException("Can not make a java.lang.Class" +

                                            " constructor accessible");

            }

        }

        obj.override = flag;

    }



© 著作权归作者所有

l
粉丝 0
博文 4
码字总数 712
作品 0
长沙
私信 提问
反射机制中获取private成员的值

我们来看下例子: 执行结果如下: 说明反射机制中无法获取到private成员的值。那到底有没有办法获取到?当然是有。Java反射机制提供的setAccessible()方法可以取消Java的权限控制检查。...

Lienson
03/28
194
0
java 反射 :setAccessible

写框架大多要用上。在写框架时,大多要调用用户自定义的类,并生成对象,调用用户的方法。由于框架事前不知道用户的类,因此需要反射。反射的主要功能,当用户指定了类位置与类名,就能生成该...

swearyd457
2013/10/10
2.1K
0
Java__线程---基础知识全面实战---坦克大战系列为例

今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自...

x-knight_勋爵
2016/04/02
0
0
java 面试知识点笔记(一)底层知识 jvm相关

问:谈谈你对java的理解? 平台无关性(一处编译多处运行) GC(垃圾回收机制) 语言特性(泛型、反射、lambda表达式) 面向对象(封装继承多态) 类库(集合、网络库、并发库、nio) 异常处...

断风格男丶
05/14
49
0
设计模式一: 单例模式(Singleton)

简介 单例模式是属于创建型模式的一种(另外两种分别是结构型模式,行为型模式).是设计模式中最为简单的一种. 英文单词Singleton的数学含义是"有且仅有一个元素的集合". 从实现层面看, 由类自身...

罪恶斯巴克
2018/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx反向代理+负载均衡+服务器宕机解决办法

反向代理 作用:保证系统安全,不暴露服务器IP,利用nginx服务器,利用内网ip进行访问,避免出现攻击服务器的情况 启动本地tomact,127.0.0.1:8080可以访问到tomcat管理页面 效果:通过 bbs....

Jack088
3分钟前
1
0
返回IEnumerable 与IQueryable相比 [关闭]

返回IQueryable<T>与IEnumerable<T>之间有什么区别? IQueryable<Customer> custs = from c in db.Customerswhere c.City == "<City>"select c;IEnumerable<Customer> custs = from c i......

技术盛宴
10分钟前
1
0
开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

点击下载《Knative 云原生应用开发指南》 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注。Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发...

阿里巴巴云原生
14分钟前
2
0
解密淘宝推荐实战,打造 “比你还懂你” 的个性化APP

手淘推荐简介 手淘推荐的快速发展源于2014年阿里“All in 无线”战略的提出。在无线时代,手机屏幕变小,用户无法同时浏览多个视窗,交互变得困难,在这样的情况下,手淘借助个性化推荐来提升...

阿里云官方博客
17分钟前
2
0
内核程序中进程的pid,handle,eprocess之间相互转换的方法

在内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开...

simpower
19分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部