精华内容
下载资源
问答
  • 获取反射的三种方式 Student stu = new Student(); Type type = typeof(Student); Type type = stu.GetType(); Type type = Type.GetType(); // 注意该方法有具体的使用规则 BindingFlags 用于限制获取成员...

    获取反射的三种方式

       Student stu = new Student();
            
       Type type = typeof(Student);
       Type type = stu.GetType(); 
       Type type = Type.GetType(); // 注意该方法有具体的使用规则
    

    BindingFlags

    用于限制获取成员的类型,不写的话只能查找到公共成员。一般BindingFlags.InstanceBindingFlags.Static必要有一个,是静态成员就用BindingFlags.Static,是实例成员就用BindingFlags.Instance,也可以两者都写。注意:BindingFlags.NonPublic用于获取非公共成员

    代码

    using System;
    using System.Reflection;
    using UnityEngine;
    
    public class ReflectionTest : MonoBehaviour
    {
        class Student
        {
            public string Name; // 公共字段
            private int Age = 10; // 私有字段
            protected int Score { get; set; } = 80; // 非公共属性
    
            protected void GoHome() // 非公共方法
            {
                Debug.Log(Age + "岁的" + Name + "回家了");
            }
            public void GoToSchool() // 公共方法
            {
                Debug.Log(Age + "岁的" + Name + "上学去了");
            }
        }
        public void Awake()
        {
            Student stu = new Student() { Name = "Tom"};
            Type type = typeof(Student);
            // 获取私有方法
            MethodInfo methodInfo = type.GetMethod("GoHome", BindingFlags.Instance | BindingFlags.NonPublic); // 后面的BindingFlags用于限制查找方法的类型,默认不写的话只能查找到公共方法
            methodInfo.Invoke(stu, null);
            // 获取私有字段
            FieldInfo fieldInfo = type.GetField("Age", BindingFlags.Instance | BindingFlags.NonPublic);
            Debug.Log(fieldInfo.Name + ":" + fieldInfo.GetValue(stu));
            // 获取私有属性
            PropertyInfo propertyInfo = type.GetProperty("Score", BindingFlags.Instance | BindingFlags.NonPublic);
            Debug.Log(propertyInfo.Name + ":" + propertyInfo.GetValue(stu));
            // 通过反射创建对象
            Student stu2 = Activator.CreateInstance(type) as Student;
            stu2.Name = "Jake";
            stu2.GoToSchool();
        }
    }
    
    展开全文
  • 获取到对象的私有字段Field后,然后设定 setAccessible 为true,然后调用字段的get方法,就可以获取到对象的数据了,同时也可以通过反射的方法获取字段的get和set方法来获取需要修改的字段 /* * @version $Id$ * ...

    获取到对象的私有字段Field后,然后设定 setAccessible 为true,然后调用字段的get方法,就可以获取到对象的数据了,同时也可以通过反射的方法获取字段的get和set方法来获取需要修改的字段

    /* * @version $Id$ * * Copyright (c) 2009-2010 yellowcong */
    package com.yellowcong.dao;
    
    import java.lang.reflect.Field;
    
    import jp.co.bsnnet.sofia.dto.keiyaku.wfgm1000.Wfgm1070FormCtlDto;
    import jp.co.bsnnet.sofia.utils.CtlField;
    
    import org.json.simple.JSONObject;
    
    /** * UserTest。 * * * * @version $Id$ */
    public class CopyOfUserTest {
    
        public static void main(String [] args) throws Exception, SecurityException{
            JSONObject obj = new JSONObject();
            Wfgm1070FormCtlDto dto = new Wfgm1070FormCtlDto();
            dto.getGrdKngaku1().setDisable(true);
            dto.getGrdKngaku1().setDefaultValue("doubi");
    
            //通过获取到字段,然后设定 setAccessible 为true,就可以访问私有变量了
            Field field = Wfgm1070FormCtlDto.class.getDeclaredField("grdKngaku1");
            field.setAccessible(true);
    
            CtlField myfile =  (CtlField)field.get(dto);
    
            System.out.println(myfile.isDisable()+myfile.getDefaultValue());
    
    
            //通过set和get方法来设定值
            CtlField myfile2=  (CtlField)Wfgm1070FormCtlDto.class.getMethod("getGrdKngaku1", null).invoke(dto, null);
            System.out.println(myfile2.isDisable()+myfile2.getDefaultValue());
        }
    }
    

    转载于:https://my.oschina.net/u/1987703/blog/1617656

    展开全文
  • Java的反射工具很强大,有句著名的话:No reflection ,no frameworks.纳整理一个小工具类:/** * @Author 落叶飞翔的蜗牛 * @Date 2018/3/10 * @Description ... * 获取私有成员变量的值 * @param instanc...

    Java的反射工具很强大,有句著名的话:No reflection ,no frameworks.

    纳整理一个小工具类:

    /**
     * @Author 落叶飞翔的蜗牛
     * @Date 2018/3/10
     * @Description
     */
    public class ReflectionUtils {
    
        /**
         * 获取私有成员变量的值
         * @param instance
         * @param filedName
         * @return
         */
        public static Object getPrivateField(Object instance, String filedName) throws NoSuchFieldException, IllegalAccessException {
            Field field = instance.getClass().getDeclaredField(filedName);
            field.setAccessible(true);
            return field.get(instance);
        }
    
        /**
         * 设置私有成员的值
         * @param instance
         * @param fieldName
         * @param value
         * @throws NoSuchFieldException
         * @throws IllegalAccessException
         */
        public static void setPrivateField(Object instance, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
            Field field = instance.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(instance, value);
        }
    
        /**
         * 访问私有方法
         * @param instance
         * @param methodName
         * @param classes
         * @param objects
         * @return
         * @throws NoSuchMethodException
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         */
        public static Object invokePrivateMethod(Object instance, String methodName, Class[] classes, String objects) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            Method method = instance.getClass().getDeclaredMethod(methodName, classes);
            method.setAccessible(true);
            return method.invoke(instance, objects);
        }
    }

    写个简单的单元测试如下:

    /**
     * @Author 落叶飞翔的蜗牛
     * @Date 2018/3/10
     * @Description
     */
    @RunWith(SpringRunner.class)
    public class ReflectionUtilsTest {
    
        private String name;
    
        private void setName(String name) {
            this.name = name;
        }
    
        @Test
        public void test() throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            ReflectionUtilsTest reflectionUtilsTest = new ReflectionUtilsTest();
            //访问私有属性
            System.out.println("name = " + ReflectionUtils.getPrivateField(reflectionUtilsTest, "name"));
            //设置私有属性
            ReflectionUtils.setPrivateField(reflectionUtilsTest, "name", "张三");
            System.out.println("name = " + ReflectionUtils.getPrivateField(reflectionUtilsTest, "name"));
            //调用私有方法
            ReflectionUtils.invokePrivateMethod(reflectionUtilsTest, "setName", new Class[]{String.class}, "李四");
            System.out.println("name = " + ReflectionUtils.getPrivateField(reflectionUtilsTest, "name"));
        }
    }

    输出结果如下:

    name = null
    name = 张三
    name = 李四

    展开全文
  • Java的反射工具很强大,有句著名的话:No reflection ,no frameworks. 纳整理一个小工具类: /** * @Author 落叶飞翔的蜗牛 ... * 获取私有成员变量的值 * @param instance * @param filedName * @return */

    Java的反射工具很强大,有句著名的话:No reflection ,no frameworks.

    纳整理一个小工具类:

    /**
     * @Author 落叶飞翔的蜗牛
     * @Date 2018/3/10
     * @Description
     */
    public class ReflectionUtils {
     
        /**
         * 获取私有成员变量的值
         * @param instance
         * @param filedName
         * @return
         */
        public static Object getPrivateField(Object instance, String filedName) throws NoSuchFieldException, IllegalAccessException {
            Field field = instance.getClass().getDeclaredField(filedName);
            field.setAccessible(true);
            return field.get(instance);
        }
     
        /**
         * 设置私有成员的值
         * @param instance
         * @param fieldName
         * @param value
         * @throws NoSuchFieldException
         * @throws IllegalAccessException
         */
        public static void setPrivateField(Object instance, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
            Field field = instance.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(instance, value);
        }
     
        /**
         * 访问私有方法
         * @param instance
         * @param methodName
         * @param classes
         * @param objects
         * @return
         * @throws NoSuchMethodException
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         */
        public static Object invokePrivateMethod(Object instance, String methodName, Class[] classes, String objects) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            Method method = instance.getClass().getDeclaredMethod(methodName, classes);
            method.setAccessible(true);
            return method.invoke(instance, objects);
        }
    }
    

    写个简单的单元测试如下:

    /**
     * @Author 落叶飞翔的蜗牛
     * @Date 2018/3/10
     * @Description
     */
    @RunWith(SpringRunner.class)
    public class ReflectionUtilsTest {
     
        private String name;
     
        private void setName(String name) {
            this.name = name;
        }
     
        @Test
        public void test() throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            ReflectionUtilsTest reflectionUtilsTest = new ReflectionUtilsTest();
            //访问私有属性
            System.out.println("name = " + ReflectionUtils.getPrivateField(reflectionUtilsTest, "name"));
            //设置私有属性
            ReflectionUtils.setPrivateField(reflectionUtilsTest, "name", "张三");
            System.out.println("name = " + ReflectionUtils.getPrivateField(reflectionUtilsTest, "name"));
            //调用私有方法
            ReflectionUtils.invokePrivateMethod(reflectionUtilsTest, "setName", new Class[]{String.class}, "李四");
            System.out.println("name = " + ReflectionUtils.getPrivateField(reflectionUtilsTest, "name"));
        }
    }
    

    输出结果如下:

    name = null
    name = 张三
    name = 李四
    

     

    展开全文
  • for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicationCode =null; try { app...
  • public static T GetPrivateProperty(this object instance, string propertyname) { BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; Type type = instance
  • MyClass myClass = new MyClass(); for(Field field : Test.class.getDeclaredFields()){ try { System.out.println(field.get(myClass)); } catch (IllegalArgumentException e) { // TOD...
  • 1. 创建测试的私有对象 /** * @author lirong * @desc 测试对象 * @date 2019/06/20 20:07 */ public class Person { private int age = 5; private String name; private Person(){} private String ...
  • 1.1.1反射private成员变量(字段) 反射private属性执行流程 1.获取学生类字节码对象2.获取学生对象3.通过getDeclaredField方法获取私有字段4.通过setAccessible让jvm不检查权限5.通过set方法设置对象为具体的值 ...
  • Java反射机制,万物皆对象,class也是一个类的对象,通过类类型,反射获得类的成员属性,构造方法,成员方法,并调用类中的方法,也可以调用私有方法。
  • 通过反射获取父类私有成员变量

    千次阅读 2019-09-19 10:19:19
    import jdk . nashorn . internal . ir . Expression ...// 获取当前对象的所有属性字段 ...// getFields():获取public修饰的字段 ...// getDeclaredFields()获取...DeBug看一下f中的数据 类中的所有成员变量都已经拿到;
  • 第一环节:(setAccessible()方法) 1、当isAccessible()的结果是false时,不允许通过...所以我们在通过反射访问某类的私有成员方法和变量的时候,f.setAccessible(true)设置为true的作用就是让我们在用反射时能够访...
  • Android 反射获取私有方法,成员变量

    千次阅读 2017-09-27 10:12:48
    public class AppInfo { private String mAppName; public String getAppName() { return mAppName; } ...//从对象中获取成员变量值 //field.getInt(obj),field.getBoolean(obj).... }
  • //获取所有的构造方法返回一个数组 还有getDeclaredConstruct(Class&lt;T&gt; class...)用于获取特定的构造方法con.newInstance(Object...);//若权限是private是不能直接执行的Construc...
  • java中反射操作私有成员变量

    千次阅读 2017-06-09 11:58:00
    java中反射操作私有成员变量 反射private成员变量(字段) 反射private属性执行流程 1. 获取学生类字节码对象 2. 获取学生对象 3. 通过getDeclaredField方法获取私有字段 4. 通过...
  • Java 反射小案例(静态私有成员获取)-kaki的博客 源类: package com.icbc.task; public class Perpson { private static String NAME = "孙悟空"; public void printName(){ System.out.println(NAME); }...
  • 反射获取私有属性

    2020-09-14 14:34:53
    类.class.getDeclaredFields()方法,获取类的所有public、private成员属性变量; 2. field[index].setAccessible(true),将私有属性变量设置为可访问的(打破了私有不可访问的规则); 2.1. field[index].get(类...
  • 之前也知道java.lang.class类里面有几个方法可以对属性以及方法提供支持,自己也没试验过这篇博客代码试了可以得到预期结果感谢原作者分享。 版权声明:https://blog.csdn.net/Mister_yang/article/details/80449774...
  • JUnit4利用反射机制测试类的私有成员
  • 反射机制中获取private成员的值

    千次阅读 2019-03-28 17:38:00
    说明反射机制中无法获取到private成员的值。那到底有没有办法获取到?当然是有。Java反射机制提供的 setAccessible() 方法可以取消Java的权限控制检查。 Arrays.stream(fields).forEach(field -> { boolean flag...
  • 此段代码是获取对象exeTask中的私有方法initConn和私有变量defaultDBConn,initConn方法是完成对数据库的连接工作。Method method = exeTask.getClass().getDeclaredMethod("initConn", new Class[]{String.class,...
  • java反射实现类外访问类的私有成员 学习本文需要提前掌握的知识:java类与对象 1、 思路分析 想要实现访问类的私有成员,我们有两个思路,一个是将私有成员转换成公有成员,另一个思路是在访问私有成员的时候绕过...
  • Java语言中,子类是不能访问父类的私有成员的,包括成员变量和方法,但可以通过Java的反射机制去访问。 其实在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,...
  • c# 通过反射获取私有方法 https://www.cnblogs.com/han1982/p/4874302.html class Program { static void Main(string[] args) { //通过反射来调私有成员 Type type = typeof(Person); ...
  • NULL 博文链接:https://747017186.iteye.com/blog/1935184

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,535
精华内容 15,414
关键字:

反射获取私有成员