java反射给字段赋值就是给实体类的set赋值,怎么做?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射给字段赋值就是给实体类的set赋值,怎么做?相关的知识,希望对你有一定的参考价值。

这个只能获取到get方法用set方法时会报错!
java.lang.reflect.Method method =
StudentsOnDisplay.class.getDeclaredMethod("getWorks" + i);
// 调用方法
Object obj = method.invoke(new StudentsOnDisplay());

亲,以下是我写的例子,你可以参考:
import java.lang.reflect.Field;
import java.util.Arrays;
import static java.lang.System.out;

enum Tweedle DEE, DUM

public class Book
public long chapters = 0;
public String[] characters = "Alice", "White Rabbit" ;
public Tweedle twin = Tweedle.DEE;

public static void main(String... args)
Book book = new Book();
String fmt = "%6S: %-12s = %s%n";

try
Class<?> c = book.getClass();

Field chap = c.getDeclaredField("chapters");
out.format(fmt, "before", "chapters", book.chapters);
chap.setLong(book, 12);
out.format(fmt, "after", "chapters", chap.getLong(book));

Field chars = c.getDeclaredField("characters");
out.format(fmt, "before", "characters",
Arrays.asList(book.characters));
String[] newChars = "Queen", "King" ;
chars.set(book, newChars);
out.format(fmt, "after", "characters",
Arrays.asList(book.characters));

Field t = c.getDeclaredField("twin");
out.format(fmt, "before", "twin", book.twin);
t.set(book, Tweedle.DUM);
out.format(fmt, "after", "twin", t.get(book));

// production code should handle these exceptions more gracefully
catch (NoSuchFieldException x)
x.printStackTrace();
catch (IllegalAccessException x)
x.printStackTrace();




输出:
BEFORE: chapters = 0
AFTER: chapters = 12
BEFORE: characters = [Alice, White Rabbit]
AFTER: characters = [Queen, King]
BEFORE: twin = DEE
AFTER: twin = DUM

如果对你有帮助的话,请采纳一下。如果有任何问题,都可以联系我!追问

实体类里面的字段都是private,只能用set方法来赋值。。

追答

好的

参考技术A package com.test;

import java.lang.reflect.Field;

public class A 
private String name;

public String getName() 
return name;


public void setName(String name) 
this.name = name;


public static void main(String[] args) 
try
Class<A> c=A.class;
Field field= c.getDeclaredField("name");//获取字段
Object obj=c.newInstance();//实例化对象
field.set(obj, "aaa");//为字段赋值
System.out.println(field.get(obj));
catch(Exception e)
e.printStackTrace();


参考技术B

    可否贴出报错信息?

    可否把你导致报错的源码贴出来?

    可否把StudentsOnDisplay类的set方法源码贴出来?

追问

StudentsOnDisplay类的set方法
就是一个私有方法的set方法没有其它的操作。

报错内容提示class.getDeclaredMethod("setWorks" + i);有异常,。。

追答

私有方法的话,调用前要设置访问权限:method.setAccessible(true);
不过我很奇怪,set方法一般是对外开放的,为啥要设为私有的呢。

追问

追答

好吧,这个set方法不是私有的。能不能把报错信息贴出来,我怀疑你的用法可能不对。

本回答被提问者采纳
参考技术C java反射只能取值 不能赋值追问

可以的

参考技术D 报什么错?

c#利用反射给字段属性赋值

先定义一个类:

 public class User
    {
        public User()
        {
            Console.WriteLine($"{this.GetType().Name}被构造");
        }
        public int Id { get; set; }
        public string Name { get; set; }

        public string ClassID;
    }

 

反射:

//常规写法赋值
{
                User user = new User();
                user.Id = 123;
                user.Name = "张三";
                user.ClassID = "1";
                Console.WriteLine($"User.Name={user.Name}");
                Console.WriteLine($"User.ClassID={user.ClassID}");
                Console.WriteLine($"User.Id={user.Id}");
            }
//利用反射动态赋值
 {
                Type type = typeof(User);  //获取类型
                object a = Activator.CreateInstance(type);   //创建对象
                foreach (var Prop in type.GetProperties())//GetProperties获取属性
                {
                    Console.WriteLine($"{type.Name}.{Prop.Name}={Prop.GetValue(a)}");
                    if (Prop.Name.Equals("Id"))
                    {
                        Prop.SetValue(a, 213);//设置值
                    }
                    else if (Prop.Name.Equals("Name"))
                    {
                        Prop.SetValue(a,"张三");
                    }
                    Console.WriteLine($"{type.Name}.{Prop.Name}={Prop.GetValue(a)}");//获取值
                }
                foreach (var Field in type.GetFields())//GetFields获取字段
                {
                    Console.WriteLine($"{type.Name}.{Field.Name}={Field.GetValue(a)}");
                    if (Field.Name.Equals("ClassID"))
                    {
                        Field.SetValue(a, "213");
                    }          
                    Console.WriteLine($"{type.Name}.{Field.Name}={Field.GetValue(a)}");
                }
            }

 

以上是关于java反射给字段赋值就是给实体类的set赋值,怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

java jdbc ResultSet结果通过java反射赋值给java对象

c#利用反射给字段属性赋值

C#控件给实体类赋值

java如何在子类中赋值给父类的变量

javaWeb中使用反射机制为数据库中表生成的实体类的的对象赋值?

C# 反射动态给属性赋值