java.lang.reflect操作对象属性(域)的值

简介: package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.
package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*2015-10-28*/
public class RefactorDemo {

    /**
     * @param args
     * @throws NoSuchFieldException
     * @throws SecurityException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */
    public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        String name = "Demo";
        double salary = 20000.0;
        String nameFieldName = "name";
        String salaryFieldName = "salary";

        Constructor<?>[] constructors = Person.class.getConstructors();
        for (Constructor<?> constructor : constructors) {
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println(parameterType.getName());
            }
        }

        System.out.println("====================================");
        //constructor
        // 这个地方需要关注:如果是基本类型,就是double.class,不是Double.class
        Constructor<Person> constructor = Person.class.getConstructor(String.class, double.class);
        Person tom = constructor.newInstance("Tom", 3000000.0);
        System.out.println(tom);


        // get private Field
        Person person = new Person(name, salary);
        Field field = person.getClass().getDeclaredField(nameFieldName);
        field.setAccessible(true);// 访问控制
        System.out.println(field.get(person));

        person = new Person(name, salary);
        field = person.getClass().getDeclaredField(salaryFieldName);
        field.setAccessible(true);
        System.out.println(field.getDouble(person));

        // set private Field
        person = new Person();
        field = person.getClass().getDeclaredField(nameFieldName);
        field.setAccessible(true);
        field.set(person, name);
        field = person.getClass().getDeclaredField(salaryFieldName);
        field.setAccessible(true);
        field.setDouble(person, salary);
        System.out.println(person);

        // process method
        person = new Person();
        field = person.getClass().getDeclaredField(salaryFieldName);
        field.setAccessible(true);
        field.setDouble(person, 100000.9);
        Method method = person.getClass().getDeclaredMethod("doubleSalary");
        method.invoke(person);
        System.out.println(field.getDouble(person));
    }
}

class Person {
    private String name;
    private double salary;

    public Person() {
        super();
    }

    public Person(String name, double salary) {
        super();
        this.name = name;
        this.salary = salary;
    }

    public void doubleSalary() {
        this.salary = this.salary * 2;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", salary=" + salary + "]";
    }

}

Output:

java.lang.String
double
====================================
Person [name=Tom, salary=3000000.0]
Demo
20000.0
Person [name=Demo, salary=20000.0]
200001.8

 

相关文章
|
8月前
|
安全 Java Apache
优雅处理 Java 对象操作:深入解析 ObjectUtils
在 Java 编程中,处理对象操作是一项常见且重要的任务。Apache Commons Lang 库中的 `ObjectUtils` 类为我们提供了许多方便且强大的方法来处理对象,包括空值处理、对象比较等。本文将引导您深入了解 `ObjectUtils` 类,探讨其特点、用法、实现方式以及在实际应用中的优势。
|
10月前
|
Java
java 通过反射遍历所有字段修改值
java 通过反射遍历所有字段修改值
167 0
|
10月前
|
Java
【Java】到底是不是同一个对象?
【Java】到底是不是同一个对象?
57 0
|
Java
在Java中,使用关键字 new 来创建一个新的对象
在Java中,使用关键字 new 来创建一个新的对象
257 0
|
Java C++ 数据格式
Java中类的成员之一:属性(field)
Java中类的成员之一:属性(field)
245 0
Java中类的成员之一:属性(field)
|
Java
Java中类的定义和对象的使用
类的定义和对象的使用的简单示例
75 0
Java中类的定义和对象的使用
|
存储 监控 算法
理解Java中对象基础Object类
Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法。
122 0
理解Java中对象基础Object类
|
存储 安全 Java
【小家java】Java中Apache Commons-lang3提供的Mutable接口提供可变的存储改变值
【小家java】Java中Apache Commons-lang3提供的Mutable接口提供可变的存储改变值
|
设计模式 Java Spring
【小家java】java中为final变量赋值的几种方式
【小家java】java中为final变量赋值的几种方式