精华内容
下载资源
问答
  • 这里使用了java的反射机制,可以访问或修改自定义类型的成员属性,而且私有的成员属性也可以访问和修改。 Configes configes = new Configes(); // 需要导入java.lang包的不要导错了,这里会抛出异常 Field field = ...

    这里使用了java的反射机制,可以访问或修改自定义类型的成员属性,而且私有的成员属性也可以访问和修改。

    Configes configes = new Configes();
    // 需要导入java.lang包的不要导错了,这里会抛出异常
    Field field = configes.getClass().getDeclaredField(name);
    // 这里会抛出异常,此异常主要是属性的访问权限,private私有属性时无法修改,直接修改权限解决
    field.setAccessible(true);
    //这里会产生类型不匹配的异常,所有进行类型判断和强转
    if(field.getType().equals(int.class)){
    		field.setInt(configes, Integer.parseInt(value));
    	}else if(field.getType().equals(float.class)) {
    		field.setFloat(configes, Float.parseFloat(value));
    	}else if(field.getType().equals(boolean.class)) {
    		field.setBoolean(configes,Boolean.parseBoolean(value));
    	}else{
    		field.set(configes,value);
    	}
    

    自定义类型的读取成员变量也是一样,用Field 的 get 方法即可。

    展开全文
  • 今天在项目遇到了一个情况,用第三方控件时,发现其在显示的时候有一...一般对于Java反射修改对象成员的示例大多体现在修改一个的基本类型的成员变量,或者其成员函数来进行调用。但是如果一个的成员变量是个...

    今天在项目中遇到了一个情况,用第三方控件时,发现其在显示的时候有一个Label字符显示,不符合产品UI需求,之后通过查看该源码,发现并没有公开方法来控制该Label的显示效果,但是自己去实现太过繁琐。之后想到可以通过Java的反射功能来进行修改,可能会达到要求。

    一般对于Java反射修改对象成员的示例大多体现在修改一个类的基本类型的成员变量,或者其成员函数来进行调用。但是如果一个类的成员变量是个引用类型,然后需要调用该对象的内部方法才能实现,这在思路上就感觉要进行两次反射才能实现,但是怎么实现呢?

    笔者也是一步步趟坑过来的,最后实现的代码很简单易懂,就是因为这样的处理很少见,所以也存在一些不解和探索的意味。下面我写个示例,来记录下该方法,供大伙借鉴。

    public class ExampleUnitTest {
    
        private A a = new A();
    
        class A {
            private int value = 0;
    
            public void setValue(int value) {
                this.value = value;
            }
    
            public int getValue() {
                return value;
            }
        }
    
        @Test
        public void addition_isCorrect() {
    
            ExampleUnitTest test = new ExampleUnitTest();
    
            try {
                //得到目标成员变量的Field
                Field f = test.getClass().getDeclaredField("a");
                f.setAccessible(true);
                //得到目标成员变量所对应的对象
                Object o = f.get(test);
                //得到目标成员变量的Class对象,是为了之后得到需要调用的方法
                Class cls = o.getClass();
                //得到最终需要进行调用设置的方法
                Method m = cls.getMethod("setValue", int.class);
                //利用得到的方法进行反射调用,请注意,这里的参数中的对像是前面获取的目前成员变量的实际对象
                m.invoke(o, 1);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
            assertEquals(1, test.a.value);
        }
    }

     

    展开全文
  • 此代码是在winform窗体示例 改变类中的字段网上方法很多 属性改变可以和字段差不多,但是结构体是值类型 修改起来有点些麻烦 下面是方法: using System; using System.Collections.Generic; using System.Component...

    此代码是在winform窗体示例 改变类中的字段网上方法很多 属性改变可以和字段差不多,但是结构体是值类型 修改起来有点些麻烦 下面是方法:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
    
            StructEnum enum1 = new StructEnum();
            ClassName class1 = new ClassName();
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void SetEnumType(ref StructEnum enumType, string fieldName, string value)
            {
                TempClass class1 = new TempClass() { EnumType = enum1 };
                TypedReference tr = TypedReference.MakeTypedReference(class1, class1.GetType().GetFields());
                enumType.GetType().GetField(fieldName).SetValueDirect(tr, value);
                enumType = class1.EnumType;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                a1 = 6;
                MessageBox.Show(cls1.MyProperty.ToString());
                //string str = comboBox1.Text;
                //MessageBox.Show(str);
                //int i1 = 4;
                //Test(ref i1);
                //MessageBox.Show(i1.ToString());
    
                //方法一
                //SetEnumType(ref enum1, "MyProperty", "1230");
    
                //方法二
                var objEnum = (object)enum1;
                var fieldsObjInfos = objEnum.GetType().GetField("MyProperty");
                fieldsObjInfos.SetValue(objEnum, "12588");
                enum1 = (StructEnum)objEnum;
    
    
                //类的测试
                var fieldInfo = class1.GetType().GetFields();
                foreach (var item in fieldInfo)
                {
                    if (item.Name == "MyProperty1")
                    {
                        item.SetValue(class1, 123);
                    }
                }
            }
    
    
    
    
            private void Test(ref int input1)
            {
                input1 = 10;
            }
    
            private int a1 = 5;
            Class1 cls1;
            private void Form1_Load(object sender, EventArgs e)
            {
                cls1 = new Class1(ref a1);
            }
        }
    
        public class ClassName
        {
            public string MyProperty;
            public int MyProperty1;
        }
        public struct StructEnum
        {
            public string MyProperty;
            public string MyProperty2;
            public int MyProperty3;
        }
    
        public class TempClass
        {
            public StructEnum EnumType;
        }
    }
    
    
    展开全文
  • C# 通过反射获取实体字段属性

    千次阅读 2020-05-10 14:11:17
    您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型。然后,可以调用类型的方法或访问其字段和属性。 优缺点 优点: 1、反射提高了程序的灵活性和扩展性。 2、降低耦合性,提高...

    C# 反射(Reflection)

    反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
    程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
    您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

    优缺点

    优点:

    1、反射提高了程序的灵活性和扩展性。
    2、降低耦合性,提高自适应能力。
    3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

    缺点:

    1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
    2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

    反射(Reflection)的用途

    反射(Reflection)有下列用途:
    它允许在运行时查看特性(attribute)信息。
    它允许审查集合中的各种类型,以及实例化这些类型。
    它允许延迟绑定的方法和属性(property)。
    它允许在运行时创建新类型,然后使用这些类型执行一些任务。

    代码

    创建一个类

    		/// <summary>
            /// 测试类
            /// </summary>
            class test
            {
                /// <summary>
                /// 姓名
                /// </summary>
                public string name { get; set; }
    
                /// <summary>
                /// 性别
                /// </summary>
                public bool sex { get; set; }
    
                /// <summary>
                /// 年龄
                /// </summary>
                public int age { get; set; }
            }
    

    读取内容

    			var t = new test() { 
                	name="张三",
                	sex=true,
                	age=22
                };
    
                foreach (System.Reflection.PropertyInfo p in t.GetType().GetProperties())
                {
                    var name = p.Name;//字段名称
                    var value = p.GetValue(t);//字段值
                    var type = p.PropertyType.Name;//字段类型
                    Console.WriteLine(name + "-------"+ value + "-------" + type);
                }
                Console.Read();
    

    输出结果
    在这里插入图片描述

    封装

    创建实体

    		/// <summary>
            /// 类型字段属性
            /// </summary>
            public class ClassAttr
            {
                /// <summary>
                /// 字段名称
                /// </summary>
                public string Name { get; set; }
    
                /// <summary>
                /// 字段值
                /// </summary>
                public string Value { get; set; }
    
                /// <summary>
                /// 字段类型
                /// </summary>
                public string TypeName { get; set; }
            }
    

    方法

    		public static List<ClassAttr> GetClassAttr<T>(T t) {
                List<ClassAttr> classAttrList = new List<ClassAttr>();
                foreach (System.Reflection.PropertyInfo p in t.GetType().GetProperties())
                {
                    ClassAttr classAttr = new ClassAttr();
                    classAttr.Name = p.Name;
                    classAttr.Value = p.GetValue(t).ToString();
                    classAttr.TypeName = p.PropertyType.Name;
                    classAttrList.Add(classAttr);
                }
                return classAttrList;
            }
    

    调用

    		static void Main(string[] args)
            {
                var t = new test() { 
                name="张三",
                sex=true,
                age=22
                };
    
                var list = GetClassAttr<test>(t);
                //这里将数据转成json格式 方法在最后
                var json = GetJson(list);
                Console.WriteLine(json);
                Console.Read();
            }
    

    输出结果

    在这里插入图片描述

    数据转json格式 使用Newtonsoft.Json

    		/// <summary>
            /// 将数据转为json字符串
            /// </summary>
            /// <param name="o"></param>
            /// <param name="DateFormat">格式化时间</param>
            /// <returns></returns>
            public string GetJson<T>(T o,string DateFormat="")
            {
                return JsonConvert.SerializeObject(o, Formatting.Indented, timeFormat);
            }
    
    展开全文
  • 通过反射机制可以操作代码片段。(class文件) 反射机制的相关在哪个报下? java.lang.reflect.*; 反射机制相关的重要的有哪些? //java.lang.Class :代表整个字节码,代表一个类型,代表整个 //java.lang....
  • 场景 在某管理系统,需要对指定员工的指定月份的指定天设置为指定的状态 注: ...然后生成相应的实体和各业务层代码,实体类属性如下 然后在前端,选择某条记录点击修改时 &...
  • 上一篇博文提到的工具,主要是用在对象的复制方面,而且代码...添加了对象合并的功能,同时还多设置了两个个参数,用一个boolean类型的参数来设定目标对象属性不为null时是否覆盖,用一个set来设定例外的情况。...
  • 反射(reflect)机制:  主要指程序可以访问、检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或...通过反射机制访问java属性,方法,构造方法。 获取Class类型的三种方式: 1.Cl...
  • 1、当遇到某个的某个成员变量、方法或是属性是私有的或是只对系统应 用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法 。 2、反射最重要的用途就是开发各种通用框架,比如在spring...
  • 反射

    2019-07-17 16:00:00
    反射是程序可以访问,检测和修改它...反射(Reflection)是.NET的重要机制,通过反射,可以在运行时获得.NET每一个类型(包括、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还...
  • 优点类似于黑客-(可以读和修改字节码文件-)通过反射机制可以操作代码片段-(class文件-) 反射机制的相在哪个包下? java . lang . reflect.*; 反射机制相关的重要的有哪些? java.lang.class:代表整个字节码,代表一...
  • 深入理解 Java 反射:Class (反射的入口)

    万次阅读 多人点赞 2017-01-18 19:58:14
    什么是 Reflection 反射,为什么要用它Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括信息、成员信息以及数组信息。Java Reflection 和 Introspection 区别?说起反射,还有一个相似的概念 ...
  • 反射机制

    2019-07-12 17:11:00
    反射(Reflection)是.NET的重要机制,通过反射,可以在运行时获得.NET每一个类型(包括、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成...
  • java反射

    2020-05-15 17:59:06
    可在运行状态,获取属性和方法,并且调用以及修改。java不是动态语言,但java被视为动态语言的一个重要的原因就是反射 动态构建对象 获得类型 反射是各种框架的灵魂 通过反射越过泛型检查 我们编写的大代码是...
  • 反射 注解 泛型

    2018-01-27 09:18:15
    通过反射,我们能够 在运行时检测对象的类型; 动态构造某个的对象; 检测属性和方法; 任意调用对象的方法; 修改构造函数、方法、属性的可见性。 反射的基础--Class 用来描述Java就是...
  • 文章目录反射机制是什么反射机制能做什么案例通过一个对象获得完整的包名...属性反射机制的动态代理在泛型为Integer的ArrayList存放一个String类型对象通过反射取得并修改数组的信息通过反射机制修改数组的大小将...
  • 三、反射机制相关API1、通过一个对象国的完成的包名和类名2、实例化Class类对象3、获取一个对象的父类与实现的接口4、获取某个类中的全部构造函数5、获取某个类的全部属性6、获取一个类的全部方法7、通过反射机制...
  • 第一章反射

    2021-05-11 20:02:49
    java反射反射概念反射的概念反射的机制反射的作用反射常用的API反射的作用使用反射的基本步骤Class获取的实例获取类型的基本信息获取属性信息获取方法的具体信息获取构造方法信息反射方式创建的实例通过反射...
  • han_反射

    2020-05-13 10:03:36
    在java,只要给定的名字,那么就可以通过反射机制获得的所有信息: 包括其访问修饰符、父类、实现的接口、属性和方法所有的信息,并可在运行时创建对象,修改属性(包括私有的)、调用方法(包括私有的) ...
  • JAVA的反射

    2018-09-22 23:26:06
    Junit在运行时通过内省遍历所有包含@Test注释的方法,通过反射调用这些方法 序列化在序列化的时候通过内省检测内部属性并保存 反射的作用 在运行时判断任意一个对象所属的 在运行时构造任意一个...
  • 反射、范型、注解

    2018-01-25 14:50:25
    通过反射,我们能够 在运行时检测对象的类型; 动态构造某个的对象; 检测属性和方法; 任意调用对象的方法; 修改构造函数、方法、属性的可见性。 反射的基础--Class 用来描述Java就是...
  • 反射相关的类4.1 class类--反射的起源4.1.1 Class类中的相关方法4.1.2 通过反射创建对象4.1.3 反射私有属性4.1.4 反射私有方法5.反射的优点和缺点 反射 1.定义 Java的反射(reflection)机制是在运行状态中,对于...
  • 通过Java反射机制可以操作(读和修改)字节码文件(.class文件),反射机制的相关存在于java.lang.reflect.*包下 几个重要的反射机制的相关 java.lang.Class:代表整个字节码(代表一个类型、整个) java....
  • JAVA反射机制学习笔记基本概念相关类介绍常用类反射机制---通过 forName 创建类对象通过反射机制+properties配置文件创建对象反射机制--访问类的属性反射机制--反编译输出类中所有方法反射机制--获取父类 ...
  • Java反射机制

    2020-08-26 09:44:08
    反射机制作用 可以操作字节码文件,有点类似与黑客。(可以读和修改字节码文件) 通过这个机制 可以操作代码片段(class文件) 反射机制在java.lang....java.lang.reflect.Field 代码字节码中的属性字节码,就是类中
  • Java学习-12、反射

    2020-08-29 12:59:24
    Java的反射指的是:指程序可以访问、检测和修改它本身状态或行为的一种能力; JAVA反射机制是在运行状态,对于任意一个,都能够知道这个的...1、通过反射获得 //1、知道权限类名;权限类名“包名.类名” //调
  • 反射(完结)

    2020-07-09 16:22:25
    可以通过反射机制操作代码片段(class文件) 在java.lang.reflect.* 包下 二、反射相关的 java.lang.Class:字节码文件。代表一个类型 java.lang.reflect.Method:字节码的方法字节码 java.lang.relect....
  • 反射 枚举和lambda

    2020-07-01 13:20:23
    2 **使用场景: 可以获取到某个对象, 以及遇到某个的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射获取到某些私有的成员或方法. (1) Class 代表的实体,...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 175
精华内容 70
关键字:

通过反射修改类中属性类型