精华内容
下载资源
问答
  • Java 反射获取私有属性和方法
    千次阅读
    2019-01-31 17:40:14

                             Java 反射获取私有属性和方法

    马上过年了,深海祝看到这篇博客的码农朋友新年快乐!

    今天下午公司没什么事情,所以写了点小东西,算是给各位的新年小礼物...

    /*
     *作者:赵星海 (CSDN-深海呐)
     *时间:2019/1/31 17:17
     *用途:反射私有属性方法Demo
     */
    public class Test {
    
        private String textData = "原始数据";
    
        private String getData() {
            return textData;
        }
    
        Test() throws Exception {
    
            Class<Test> MyClass = Test.class;// 获取class对象
            Test text = MyClass.newInstance(); // 获取新建对象
    
            Field[] fs = MyClass.getDeclaredFields();// 获取所有属性
            for (int i = 0; i < fs.length; i++) {
                fs[i].setAccessible(true);// 将目标属性设置为可以访问
                fs[i].set(text, "CSDN-深海呐");//将属性值重新赋值
            }
    
            Method[] ms = MyClass.getDeclaredMethods();// 获取获取class对象所有的方法
            for (int i = 0; i < ms.length; i++) {
                ms[i].setAccessible(true);// 将目标属性设置为可以访问
                // 用Eclipse的后端小伙伴请使用System.out.println()打印结果
                Log.e("反射得到的第"+i+"个方法", ms[i].getName());
            }
    
            Method m = MyClass.getDeclaredMethod("getData");
            m.setAccessible(true);
            // 用Eclipse的后端小伙伴请使用System.out.println()打印结果
            Log.e("方法返回值: ", "" +(ms[0]==null?"":m.invoke(text))); // 正确输出结果 "CSDN-深海呐"
    
    
        }
    
    }

     

    更多相关内容
  • 反射获取私有属性

    2020-12-30 14:48:08
    // 暴力反射获取属性 Field filed = class1.getDeclaredField("name"); // 设置反射时取消Java的访问检查,暴力访问 filed.setAccessible(true); filed.set(studObject, "哈哈哈"); Object nameObject = filed.get...

    package com.day14.fanshe;

    import java.lang.reflect.Field;

    public class Test {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,

    InstantiationException, IllegalAccessException {

    // TODO Auto-generated method stub

    //Student student = new Student();

    //Class extends Student> class1=student.getClass();

    //class1.getName();

    //System.out.println(class1.getName());

    //

    //Class extends Student> class1=new Student().getClass();

    //

    //try {

    //Class> class1=Class.forName("com.day14.fanshe.Student");

    //

    //Beans bean=(Beans) class1.newInstance();

    //

    //} catch (Exception e) {

    TODO: handle exception

    //}

    // 获取字节码对象

    Class class1 = Class.forName("com.day14.fanshe.Student");

    // 创建学生对象

    Object studObject = class1.newInstance();

    // 暴力反射获取属性

    Field filed = class1.getDeclaredField("name");

    // 设置反射时取消Java的访问检查,暴力访问

    filed.setAccessible(true);

    filed.set(studObject, "哈哈哈");

    Object nameObject = filed.get(studObject);

    System.out.println(nameObject);

    }

    }

    标签:反射,私有,studObject,Student,filed,fanshe,属性,Class,class1

    来源: https://blog.csdn.net/weixin_42591732/article/details/94052992

    展开全文
  • 反射获取私有属性的值
    public static void getBeanUtils(Object newBean) throws NoSuchFieldException, IllegalAccessException {
            /**
             * 通过字段名称获取类的属性  newBean.getClass()获取字节码文件  
             * getField 只能获取public修饰的
             * getDeclaredField可以获取所有修饰符修饰的字段
             */
            Field field = newBean.getClass().getDeclaredField("addTime");
            //设置访问权限为可访问
            field.setAccessible(true);
            //返回指定对象中字段名称为addTime的值
            Object o = field.get(newBean);
            System.out.println(o);
        }
    
    展开全文
  • NULL 博文链接:https://747017186.iteye.com/blog/1935184
  • java 反射 调用私有方法(有参数私有方法)获取私有属性
  • 绍Java反射获取私有构造函数、属性、方法
  • C# 使用反射获取私有属性的方法 原创lindexi_gd 最后发布于2019-04-16 10:15:23 阅读数 1414 收藏 展开 本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多 在开始...

    C# 使用反射获取私有属性的方法
    indexi_gd

    本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多

    在开始之前先添加一个测试的类

    public class Foo{
         private string F { set; get; } = "123";
    }

    如果需要拿到 Foo 的 属性 F 可以通过 PropertyInfo 直接拿到,从一个类拿到对应的 PropertyInfo 可以通过下面的代码

    var foo = new Foo();
    
    var type = foo.GetType();
    const BindingFlags InstanceBindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
    
    var propertyName = "F";
    
    PropertyInfo property = type.GetProperty(propertyName, InstanceBindFlags);
    if (property == null){
        throw new MissingFieldException(propertyName);
    }


    实际上可能在 type.GetProperty 还拿不到 property 需要通过不断找到基类

    PropertyInfo property = null;
    
    while (type != null){
          property = type.GetProperty(propertyName, InstanceBindFlags);
          if (property != null){
              break;
          }
    
          type = type.BaseType;
    }
    
    if (property == null){
         throw new MissingFieldException(propertyName);
    }
    


    现在就获得了 PropertyInfo 通过这个属性可以拿到类的属性,这里拿到属性有三个不同的方法

    GetValue

    GetGetMethod

    GetAccessor

    其中最简单的是通过 GetValue 的方法,请看下面

    GetValue
    最简单的方法直接调用 GetValue 的方法

                var f = property.GetValue(foo);

    1
    2
    这里的 f 就是属性

    GetGetMethod
    这里的两个 Get 不是写错了,而是拿到 Get 方法的意思,也就是需要属性有 get 方法才可以使用下面代码

     MethodInfo getter = property.GetGetMethod(nonPublic: true);
     var f = getter.Invoke(foo, null);
    1
    2
    通过 GetGetMethod 可以拿到 MethodInfo 方法,如果对属性的返回值是可见的,如上面的 Foo 是使用 string 作为属性的类,可以通过创建委托的方式提高性能。

    如果对于属性的返回值是不可见的,也就是返回值是拿不到的,就无法通过创建委托的方式提高性能。

    GetAccessor
    最后一个方法是通过 GetAccessor 访问器的方法,需要引用表达式

           /// <summary>
            /// 获取 <paramref name="type"/> 的给定 <paramref name="propertyName"/> 属性的获取方法
            /// </summary>
            /// <param name="type"></param>
            /// <param name="propertyName">属性名,属性可以是私有</param>
            /// <returns>
            /// 属性的 get 方法,传入对应的实例返回属性
            /// <example>
            /// var f = new F();
            /// var getAccessor = GetPropertyGetAccessor(f.GetType(), "privateProperty");
            /// getAccessor(f);// 获取属性
            /// </example>
            /// </returns>
            [Pure]
            public static Func<object, object> GetPropertyGetAccessor([NotNull] Type type, [NotNull] string propertyName)
            {
                if (ReferenceEquals(type, null)) throw new ArgumentNullException(nameof(type));
                if (ReferenceEquals(propertyName, null)) throw new ArgumentNullException(nameof(propertyName));

                var property = type.GetProperty(propertyName, InstanceBindFlags);
                if (property == null)
                {
                    throw new MissingFieldException(propertyName);
                }
             
                var method = property.GetGetMethod(true);

                var obj = Expression.Parameter(typeof(object), "o");

                Debug.Assert(method.DeclaringType != null);

                Expression<Func<object, object>> expression =
                    Expression.Lambda<Func<object, object>>
                    (
                        Expression.Convert
                        (
                            Expression.Call
                            (
                                Expression.Convert(obj, method.DeclaringType),
                                method
                            ),
                            typeof(object)
                        ),
                        obj
                    );

                return expression.Compile();
            }

    通过这个方法可以创建一个委托出来,通过这个委托可以拿到很高的性能,在下面我测试了不同的方法的性能

    测试
    首先是通过 GetValue 的方式经过 1 次 和 100 次运行,测试方法都是通过C# 标准性能测试 但是在测试完成需要告诉大家结论

    使用 GetValue 的方式和使用其他几个反射拿到属性的方法的性能都是差不多的,所以不需要对私有属性反射去优化

    Method    Categories    Mean    Error    StdDev
    'GetProperty 调用1次反射'    1次调用    205.5 ns    2.882 ns    2.555 ns
    'GetProperty 调用100次反射'    100次调用    20,059.9 ns    121.177 ns    113.349 ns
    因为 GetValue 没有使用缓存的方法,而缓存也只是缓存 PropertyInfo 的值,于是在下面测试 GetGetMethod 的方法,这个方法在跑100次就添加了缓存

            public void GetPropertyGetAccessorMethodInfo_Call100()
            {
                var foo = new Foo();

                var type = foo.GetType();
                const BindingFlags InstanceBindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

                var propertyName = "F";


                PropertyInfo property = null;

                while (type != null)
                {
                    property = type.GetProperty(propertyName, InstanceBindFlags);
                    if (property != null)
                    {
                        break;
                    }

                    type = type.BaseType;
                }

                if (property == null)
                {
                    throw new MissingFieldException(propertyName);
                }

                MethodInfo getter = property.GetGetMethod(nonPublic: true);


                for (int i = 0; i < 100; i++)
                {
                    var yasriWelducadow = getter.Invoke(foo, null);
                }
            }

    运行测试可以看到

    Method    Categories    Mean    Error    StdDev
    'GetPropertGetAccessorMethodInfo 调用一次'    1次调用    191.6 ns    0.7641 ns    0.6774 ns
    'GetPropertGetAccessorMethodInfo 调用100次'    100次调用    10,341.9 ns    134.9177 ns    126.2021 ns
    相对于 GetValue 没有带缓存的 GetGetMethod 带缓存的性能是 GetValue 的一倍,也就是找到 PropertyInfo 占用的时间如果能减少,就可以提高速度。

    最后通过 GetPropertyGetAccessor 创建委托,然后缓存委托的方式调用 1 次和 100 次。在调用 1 次的过程是包括第一次初始化的时间,而调用 100 次是包括和不包括第一次初始化

    Method    Categories    Mean    Error    StdDev
    'GetPropertyGetAccessor 调用一次'    1次调用    206,282.4 ns    4,051.754 ns    5,939.008 ns
    'GetPropertyGetAccessor 调用100次'    100次调用    222,227.4 ns    4,354.600 ns    6,906.857 ns
    'GetPropertGetAccessorMethodInfo 带缓存调用100次'    100次调用    10,352.2 ns    141.629 ns    132.480 ns
    可以看到 GetPropertyGetAccessor 方法在初始化的时间很长,而带缓存的调用和 GetGetMethod 的方法调用的时间几乎一样长

    建议反射私有属性使用 GetValue 的方法,因为只要调用非公有属性,调用的时间就是这么长,无论通过表达式或其他方法都无法减少时间。如果遇到需要提高反射属性的速度,建议修改属性为公开,这时可以通过 fast member 快速拿到属性


    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

    点赞 2
    ————————————————
    版权声明:本文为CSDN博主「lindexi_gd」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lindexi_gd/article/details/89328025

    展开全文
  • 前言 Java中的反射可以帮助程序做很多是事,对于运行状态下的类能获取其所有属性和方法。 一个类中的公共和私有的变量和方法、... setAccessible(true)关闭java语言访问检查,如果想要获取私有成员需要设置为true,不
  • JAVA反射获取私有属性

    千次阅读 2018-12-01 17:27:31
    反射获取类对象,获取私有属性和方法集合,然后取消访问检查setAccessible(true),最后调用私有属性或方法。 反射优点: 能够运行时动态获取类的实例,大大提高了系统的灵活性和扩展性; 与java动态编译相结合,...
  • 今天在面试的时候遇到一个非常nice的面试官,当时问到了如何通过反射获取私有属性,虽然本人之前也有做过,不过今天面试官一问顿时一脸懵逼,于是打算写这篇博客记录下来。先来看下我们的javaBeanpublic class ...
  • Java反射获取私有属性和方法

    千次阅读 2019-06-28 13:01:31
    //使用反射获取如下类中的属性以及方法,并给属性赋值为:"李四",并调用其中的eat方法打印结果为:李四在吃苹果 // // public class Student{ // // private Student(){} // private String name; // // ...
  • java通过反射获取对象的指定属性值(包括私有属性值和指定注解属性值)
  • 尽管普遍认知是,实际可以通过反射访问其他类的私有属性和方法。它甚至并不难。这个特性在单元测试中特别有用。本文将告诉你如何做。注意:这只能在单体Java应用程序中运行,比如单元测试和常规程序。如果你尝试在...
  • 反射-Field:通过反射机制,获取对象属性+私有属性package com.wenqidao.java.reflect;import com.wenqidao.java.bean.Student;import java.lang.reflect.Field;/*必须掌握:怎么通过反射机制访问一个java对象的属性...
  • java 反射获得私有属性的对象

    千次阅读 2017-03-01 15:41:25
    pbulic class Json2Body () {    private ObjectMapper om;  public Json2Body() {  om = new ObjectMapper();    }    pulbic static m
  • 以下要说明的问题是如何直接对某个特定类的私有属性( private field)不使用其暴露的 set方法而是直接进行设值操作,或调用类的私有方法( private method)。首先要说明的是,这在 java里是允许这么做的。虽然这样直接...
  • 直接上代码 主要方法是 Class t=people.getClass(); //反射 Field text=t.getDeclaredField(“text”);//获得需要访问的属性 text.setAccessible(true);...//获得私有属性 public class test { ...
  • 1、新建一个类,并设置私有属性值 public class Student { private String name = "kobe"; public String getName() { return name; } } 2、新建测试类 import java.lang.reflect.Field; public ...
  • //设置私有属性范围 field.set(tObject, 10); System.out.print(field.get(tObject)); try { Method method=class1.getMethod("setAge", int.class); method.invoke(tObject, 11); Method getMethod=class1....
  • 下面小编就为大家带来一篇利用java反射机制调用类的私有方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 1、首先,创建一个类,部分属性和方法设置为private。 package com.example.demo.utils; /** * @Author HL * @Date 2021年3月20日 */ public class Person { private String id = "10"; private String name...
  • 1.什么是java反射机制? 1.1 反射机制是java具有动态性的关键;那么何为动态性,动态性就是在程序运行时可以改变代码的内部结构,即代码运行过程中,代码内容会发生改变;java反射将Class对象作为核心,Class本身也是一个类...
  • 备忘一下,拿Field的时候要用getClass().getSuperclass()来获取Field: Field f= getClass().getSuperclass().getDeclaredField("sqlSessionFactory"); f.setAccessible(true); ssf= (SqlSessionFactory) f.get(this...
  • 1. 创建测试的私有对象 /** * @author lirong * @desc 测试对象 * @date 2019/06/20 20:07 */ public class Person { private int age = 5; private String name; private Person(){} private String ...
  • 案例:Map集合若有key(键)与User类中的私有属性相同,就把对应的value值赋值给该私有属性。 User类: public class User { private int id; private String name; private String sex; private String ...
  • Java反射——获取私有属性及方法

    千次阅读 2019-05-16 18:10:06
    首先创建一个class,属性及方法均设为private,私有类型 public class PrivateClass { private String id = "127.0.0.1"; private String port = "8080"; private String url() { return id + ":" + port...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,901
精华内容 23,160
关键字:

反射获得私有属性