大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现。那么什么是反射呢?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。说白了,反射就是加载类,并且反射出类的各个组成部分的一种实现方式。

Java是一种面向对象的语言,它使用一个类中的字段对数据进行分装,这样的话可以方便类的操作和描述,下面的例子将演示如何利用反射获取类的字段。

1.创建一个简单的Person类

package com.day09;

public class Person {
public String name = "zhangsan";
private int age = 23;
public static String country = "China"; }

2.利用Junit来演示进行演示测试

package com.day09;

import java.lang.reflect.Field;

import org.junit.Test;

public class ReflectFieldDemo {

    /**
* 反射类的字段 public String name = "zhangsan";
*
* @throws Exception
*/
@Test
public void reflectPublicField() throws Exception {
// 将person类加载到内存中
Class<?> clazz = Class.forName("com.day09.Person");
// 通过clazz创建一个对象
Person p = (Person) clazz.newInstance();
// 通过字段的名字获取对应的字段
Field filed = clazz.getField("name");
// 获取字段的类型
Class type = filed.getType();
System.out.println(type);
// 传入一个对象,来获取该对象的值
Object obj = filed.get(p);
if (type.equals(String.class)) {
String value = (String) obj;
System.out.println(value);
}
// 赋值
filed.set(p, "王五");
System.out.println(p.name); } /**
* 反射类的字段 private int age = 23;
*
* @throws Exception
*/
@Test
public void reflectPrivateField() throws Exception {
// 将person类加载到内存中
Class<?> clazz = Class.forName("com.day09.Person");
// 通过clazz创建一个对象
Person p = (Person) clazz.newInstance();
// 因为是私有字段,需要通过getDeclaredField该方法传入字段的名字获取对应的字段
Field filed = clazz.getDeclaredField("age");
// 释放权限,设为可见
filed.setAccessible(true);
// 获取字段的类型
Class type = filed.getType();
System.out.println(type);
// 传入一个对象,来获取该对象的值
Object obj = filed.get(p);
if (type.equals(int.class)) {
int value = (int) obj;
System.out.println(value);
}
} /**
* 反射类的字段 public static String country = "China";
*
* @throws Exception
*/
@Test
public void reflectStaticField() throws Exception {
// 将person类加载到内存中
Class<?> clazz = Class.forName("com.day09.Person");
// 通过字段的名字获取对应的字段
Field filed = clazz.getField("country");
// 获取字段的类型
Class type = filed.getType();
System.out.println(type);
// 因为是静态的无需传入对象,来获取该类该对象的值
Object obj = filed.get(null);
if (type.equals(String.class)) {
String value = (String) obj;
System.out.println(value);
}
}
}

至此,我们已将常见的几种通过反射获得类中字段的方法演示完毕,有不足的地方,希望大家多多提意见!

java反射——字段的更多相关文章

  1. 【译】4. Java反射——字段

    原文地址:http://tutorials.jenkov.com/java-reflection/fields.html ======================================= ...

  2. 【译】7. Java反射——私有字段和私有方法

    原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...

  3. Java 反射机制学习资料

    Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...

  4. Java反射——引言

    Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...

  5. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

  6. 【译】2. Java反射——Class对象

    原文地址:http://tutorials.jenkov.com/java-reflection/classes.html ====================================== ...

  7. 【译】3. Java反射——构造函数

    原文地址:http://tutorials.jenkov.com/java-reflection/constructors.html ================================= ...

  8. 【译】5. Java反射——方法

    原文地址:http://tutorials.jenkov.com/java-reflection/methods.html ====================================== ...

  9. 【译】6. Java反射——Getter和Setter

    原文地址:http://tutorials.jenkov.com/java-reflection/getters-setters.html ============================== ...

随机推荐

  1. HTTP Cache怎样计算Age

    这里的Age指的是响应头Age.以下内容有部分翻译,也有部分自己的理解.欢迎讨论. 我们用now表示当前主机的当前时间,用request_time表示缓存发起请求的时间,用response_time表 ...

  2. nginx-1.2.7 + tcp_proxy_module手动编译安装

    Nginx开源软件默认没有提供TCP协议的负载均衡,下面记录一下我的安装过程: 1. 下载nginx最新稳定版的源码.可访问:http://www.nginx.org 或 linux命令下载到本地: ...

  3. C#颜色 Color.FromArgb ColorTranslator 16进制

    //方法1: //引用命名空间 using System.Drawing; 16进制颜色代码转Color类型:ColorTranslator.FromHtml(color); Color类型转16进制 ...

  4. [svc]linux文件特殊权限

    这是老以前写的文章, 断断续续的可见那时候的心态还是不稳的. 生产使用: g1,g2组2个组的员工,  g2组要访问g1组/home下的文件,rx权限.  这个setfacl就有用. 方法1: 修改普 ...

  5. NEFU 117-素数个数的位数(素数定理)

    题目地址:NEFU 117 题意:给你一个整数N(N<1e9).假设小于10^N的整数中素数的个数为π(N).求π(N)的位数是多少. 思路:题目的数据量非常大,直接求肯定TLE,所以考虑素数定 ...

  6. matplotlib之设置极坐标的方向

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: polar.py #Auth ...

  7. python模块学习之warnings

    warnings.warn(message, category=None, stacklevel=, source=None) 发出警告,或者忽略它或引发异常. category参数(如果给定)必须是 ...

  8. poj1703 Find them, Catch them(并查集的应用)

    Find them, Catch them   Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32225   Accepte ...

  9. Mac上Nginx-增加对HLS的支持

    Mac上Nginx-增加对HLS的支持 我们在Mac上搭建直播服务器Nginx说了如何在Mac搭建视频直播服务器Nginx,对RTMP推流和RTMP拉流的支持.接下来说说如何增加对HLS的支持. 在N ...

  10. 日期在苹果手机上显示NaN的处理方法

    注意两点即可: 1.苹果只认识 yyyy/mmmm/dddd/  这类格式的日期 2.如果输出后还要进行处理日期对比,苹果默认会带中文字,如:年月日,需要转成上面1当中的日期格式在转时间戳进行比较 G ...