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对象