当前位置:首页 > 技术 >

java中反射set方法和get方法(java通过反射获取类的属性)

来源:原点资讯(www.yd166.com)时间:2023-04-10 13:38:06作者:YD166手机阅读>>

@Test public void test2() throws NoSuchMethodException { Class<Student> sc = Student.class; // 1. 拿到所有的构造器 Constructor<?>[] constructors = sc.getDeclaredConstructors(); // 输出构造器的名称 参数个数 for (Constructor<?> constructor : constructors) { System.out.println(constructor.getName() " 参数个数:" constructor.getParameterCount() "个"); } // 2. 拿到单个构造器 Constructor<Student> constructor = sc.getDeclaredConstructor(String.class, String.class); System.out.println(constructor.getName() "参数个数:" constructor.getParameterCount()); }

使用反射技术获取构造器对象并使用获取到的内容创建出一个对象

反射得到构造器之后的作用仍是创建一个对象,如果说构造器是public,就可以直接new对象,如果说是构造器是私有的private,需要提前将构造器进行暴力反射,再进行构造对象。

反射是可以直接破换掉封装性的,私有的也是可以执行的。

java中反射set方法和get方法,java通过反射获取类的属性(9)

Field类及其用法

Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

Field类涉及的get方法

java中反射set方法和get方法,java通过反射获取类的属性(10)

同样的道理,我们可以通过Class类的提供的方法来获取代表字段信息的Field对象,Class类与Field对象相关方法如下:

java中反射set方法和get方法,java通过反射获取类的属性(11)

下面的代码演示了上述方法的使用过程

public class ReflectField { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class<?> clazz = Class.forName("reflect.Student"); //获取指定字段名称的Field类,注意字段修饰符必须为public而且存在该字段, // 否则抛NoSuchFieldException Field field = clazz.getField("age"); System.out.println("field:" field); //获取所有修饰符为public的字段,包含父类字段,注意修饰符为public才会获取 Field fields[] = clazz.getFields(); for (Field f : fields) { System.out.println("f:" f.getDeclaringClass()); } System.out.println("================getDeclaredFields===================="); //获取当前类所字段(包含private字段),注意不包含父类的字段 Field fields2[] = clazz.getDeclaredFields(); for (Field f : fields2) { System.out.println("f2:" f.getDeclaringClass()); } //获取指定字段名称的Field类,可以是任意修饰符的自动,注意不包含父类的字段 Field field2 = clazz.getDeclaredField("desc"); System.out.println("field2:" field2); } /** 输出结果: field:public int reflect.Person.age f:public java.lang.String reflect.Student.desc f:public int reflect.Person.age f:public java.lang.String reflect.Person.name ================getDeclaredFields==================== f2:public java.lang.String reflect.Student.desc f2:private int reflect.Student.score field2:public java.lang.String reflect.Student.desc */ } class Person { public int age; public String name; //省略set和get方法} class Student extends Person { public String desc; private int score; //省略set和get方法 }

上述方法需要注意的是,如果我们不期望获取其父类的字段,则需使用Class类的getDeclaredField/getDeclaredFields方法来获取字段即可,倘若需要连带获取到父类的字段,那么请使用Class类的getField/getFields,但是也只能获取到public修饰的的字段,无法获取父类的私有字段。下面将通过Field类本身的方法对指定类属性赋值,代码演示如下:

//获取Class对象引用

Class<?> clazz = Class.forName("reflect.Student");

Student st= (Student) clazz.newInstance();

//获取父类public字段并赋值

Field ageField = clazz.getField("age");

ageField.set(st,18);

Field nameField = clazz.getField("name");

nameField.set(st,"Lily");

//只获取当前类的字段,不获取父类的字段

Field descField = clazz.getDeclaredField("desc");

descField.set(st,"I am student");Field scoreField = clazz.getDeclaredField("score");

//设置可访问,score是private的

scoreField.setAccessible(true);

scoreField.set(st,88);System.out.println(st.toString());

//输出结果:Student{age=18, name='Lily ,desc='I am student', score=88}

//获取字段值System.out.println(scoreField.get(st));// 88

其中的set(Object obj, Object value)方法是Field类本身的方法,用于设置字段的值,而get(Object obj)则是获取字段的值,当然关于Field类还有其他常用的方法如下:

java中反射set方法和get方法,java通过反射获取类的属性(12)

栏目热文

java中set的用法整理(java里set如何使用)

java中set的用法整理(java里set如何使用)

Set是Java集合类中的一部分,继承了Collection接口。特点:Set中的数据不允许重复。基本操作1、创建Set...

2023-04-10 13:25:06查看全文 >>

java中的get和set方法有什么用(javaget方法和set方法有什么用)

java中的get和set方法有什么用(javaget方法和set方法有什么用)

我们先来看看set和get这两个词的表面意思,set是设置的意思,而get是获取的意思,顾名思义,这两个方法是对数据进行...

2023-04-10 14:08:20查看全文 >>

java中set和get用法(java中set集合的用法)

java中set和get用法(java中set集合的用法)

对于 java 初学者来说,set 和 get 这两个方法似乎已经很熟悉了,这两个方法就是 JAVA 编程中的基本用法,...

2023-04-10 13:21:23查看全文 >>

java类的get和set方法是灰色的(javaget方法和set方法有什么用)

java类的get和set方法是灰色的(javaget方法和set方法有什么用)

对于 java 初学者来说,set 和 get 这两个方法似乎已经很熟悉了,这两个方法就是 JAVA 编程中的基本用法,...

2023-04-10 13:31:23查看全文 >>

java中set和get后的括号用法(java中set的用法详解)

java中set和get后的括号用法(java中set的用法详解)

对于 java 初学者来说,set 和 get 这两个方法似乎已经很熟悉了,这两个方法就是 JAVA 编程中的基本用法,...

2023-04-10 13:41:39查看全文 >>

java的set用法(java 什么时候使用set)

java的set用法(java 什么时候使用set)

序欢迎来到全网最完整的java进阶知识系列教程!!!每天定时更新!!!本期是Java进阶知识系列的第五讲,继上一讲Lis...

2023-04-10 13:59:33查看全文 >>

岗南水库最深多少米(岗南水库一般多深)

岗南水库最深多少米(岗南水库一般多深)

河北位于我国华北地区,西部和北部是高山,南部和东部是平原。本省属于温带大陆型季风气候,年均降水量500毫米左右,水资源紧...

2023-04-10 14:10:27查看全文 >>

河北第一大水库(河北十大水库排名)

河北第一大水库(河北十大水库排名)

旅游风物志,揽四海胜景,博人间风华。河北唐山,素有“京东宝地”之称,地貌复杂多样,整体来说,背山临海,位于迁西县的八面峰...

2023-04-10 14:08:24查看全文 >>

黄壁庄水库深度多少米(黄壁庄水库库容量多少)

黄壁庄水库深度多少米(黄壁庄水库库容量多少)

炎炎夏日,带上家人邂逅绿水青山,在大自然中感受清凉。或静坐在山顶,观云海涌动、星空灿烂;或立在岸边,看夕阳西下,享人生美...

2023-04-10 13:50:42查看全文 >>

王快水库水深多少米(王快水库的水主要来自哪里)

王快水库水深多少米(王快水库的水主要来自哪里)

■回眸百年党史 见证“治水”初心系列报道之四□本报记者 安亚静 邸志永 刘澜8月2日,王快水库溢洪道水声阵阵。库水从提起...

2023-04-10 14:01:07查看全文 >>

文档排行