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

首页 > 技术 > 作者:YD1662023-04-10 13:38:06

@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)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.