zoukankan      html  css  js  c++  java
  • java_reflect_02

    按我们所知道的.对于类中的method,constructor,field如果访问属性是private的情况下我们是访问不了的,但通过反射就可以做到

    仔细分析api发现Method,Constructor,Field这三个类全都继承了java.lang.reflect.AccessibleObject

    AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。

    在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。

    一,创建一个Field,Method,Constructor全为private的po类

    package po;
    
    public class User2 {
        private String name="wangyang";
        private User2(){
            
        }
        private String getName(){
            return this.name;
        }
    }

    二,通过反射来调用里面的属性,方法

    @Test
        public void test02() throws Exception{
            Class<?> clazz=Class.forName("po.User2");
            Constructor c=clazz.getDeclaredConstructor(null);
            c.setAccessible(true);
            Object newInstance = c.newInstance(null);
            Field name=clazz.getDeclaredField("name");
            name.setAccessible(true);
            System.out.println(name.get(newInstance));
            //wangyang
            Method m=clazz.getDeclaredMethod("getName", null);
            m.setAccessible(true);
            System.out.println(m.invoke(newInstance, null));
            //wangyang
        }

    我们可以发现也可以全部实现效果

    如果想用反射修改访问控制检查的话,获取Method和Field对象的时候一定要用getDeclaredField和getDeclaredMethod。不要用getField和getMethod。

    虽然这两个方法的参数都是相同的,但不同点在于getMethod和getField只能获得public修饰的属性和方法。而getDeclared可以获取任何类型的属性和方法,因为这个例子要调用私有的属性和方法,所以要用getDeclaredXX。

  • 相关阅读:
    Sqlserver 代码格式化工具,可提高开发效率
    Html.Partial和Html. RenderPartial用法
    Javascript中的Table导出成Excel表格
    C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
    C# 开源框架(整理)
    NFine:.NET快速开发平台 NFine.Framework Web框架
    ansible使用setup模块查看受控机的信息(ansible2.9.5)
    ansible用get_url模块在受控机下载文件(ansible2.9.5)
    ansible通过yum/dnf模块给受控机安装软件(ansible2.9.5)
    centos8平台编译安装nginx1.18.0
  • 原文地址:https://www.cnblogs.com/wangyang108/p/5667159.html
Copyright © 2011-2022 走看看