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

java.lang.reflect操作对象属性(域)的值的更多相关文章

  1. java 编程基础 Class对象 反射 :数组操作java.lang.reflect.Array类

    java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组, ...

  2. 利用java.lang.reflect.Constructor动态实例化对象

         }                    }                    }                    }  }              Student t = co ...

  3. java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】

    转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T&g ...

  4. java 编程基础 Class对象 反射:动态代理 和AOP:java.lang.reflect.Proxy:(Proxy.newProxyInstance(newProxyInstance​(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h))

    为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦.   Proxy类的使用规则 Proxy提 ...

  5. Java反射API研究(2)——java.lang.reflect详细内容与关系

    对于最新的java1.8而言,reflect中接口的结构是这样的: java.lang.reflect.AnnotatedElement java.lang.reflect.AnnotatedType ...

  6. java.lang.reflect.Field

    java.lang.reflect.Field 一.Field类是什么 Field是一个类,位于java.lang.reflect包下. 在Java反射中 Field类描述的是 类的属性信息,通俗来讲 ...

  7. JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

    JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 ja ...

  8. 本地tomcat调用远程接口报错:java.lang.reflect.InvocationTargetException

    今天碰到一个奇怪的问题,本地Eclipse起了一个tomcat通过http去调一个外部接口,结果竟然报了一个反射的异常,先看下完整日志: , :: 下午 org.apache.catalina.sta ...

  9. java.lang.reflect.Method

    java.lang.reflect.Method 一.Method类是什么 Method是一个类,位于java.lang.reflect包下. 在Java反射中 Method类描述的是 类的方法信息, ...

随机推荐

  1. 重新想象 Windows 8 Store Apps (4) - 控件之提示控件: ProgressRing; 范围控件: ProgressBar, Slider

    原文:重新想象 Windows 8 Store Apps (4) - 控件之提示控件: ProgressRing; 范围控件: ProgressBar, Slider [源码下载] 重新想象 Wind ...

  2. Eclipse+Maven创建webapp项目<一> (转)

    Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显 ...

  3. C++ Primer 学习笔记_53_类和数据抽象 --友元、static员

    分类 --友元.static成员 一.友元 友元机制同意一个类将对其.友元关系:一个样例 如果一个窗体管理类Window_Mgr可能须要訪问由其管理的Screen对象的内部数据.Screen应该同意其 ...

  4. 【Nginx】开发一个简单的HTTP模块

    首先来分析一下HTTP模块是怎样介入Nginx的. 当master进程fork出若干个workr子进程后,每一个worker子进程都会在自己的for死循环中不断调用事件模块: for ( ;; ) { ...

  5. WinCE CAB Manager 3.0学习

    VS自带智能设备打包工具,能实现打包.但是,打包安装部署之后,设备上面没有卸载,找了好多资料,最终都没有解决. WinCE CAB Manager3.0完美解决. 打包步骤如下, 一,打开WinCE ...

  6. filestream.read(buffer,offset,count)的正确解释

    filestream.read(buffer,offset,count) offset是buffer的偏移量 所以,filestream.read(buffer,1,count)会报下面的错 Syst ...

  7. Oracle基于学习3--Oracle创建用户和授权

    Oracleserver端的操作,如以下一般: 1)       安装Oracleserver软件 2)       创建数据库(安装时自己主动创建) 3)       配置监听(安装时自己主动配置) ...

  8. ReplaceGoogleCDN:将 Google CDN 更换国家

    Chrome Web Store 安装地址:  https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkk ...

  9. Ubuntu在构建Robotframework+Selenium周围环境

    最近经历了从Windows进入系统Ubuntukylin下列.因此,测试工具也需要被重新安装,今天和共享安装过程. 我用的是环境:Ubuntu Kylin 14.04 64Bit系统. 启动权,首先, ...

  10. scrot-0.8

    相关库下载地址:         www.sunfreeware.com/programlistsparc10.html tar -zxvf scrot-0.8.tar.gzcd scrot-0.8. ...