获取域

  1. 通过反射API可以获取到类中公开的静态域和对象中的实例域。得到表示域的java.lang.reflect.Field类的对象之后,就可以获取和设置域的值。

与获取构造方法类似,Class类中有4个方法用来获取域:

getFileds()、getFiled(fieldName)、 getDeclaredFields()、getDeclaredField(fieldName),其含义与获取构造方法的4个方法类似。

静态域和实例域的区别是:在使用静态域的时候,不需要提供具体对象实例,使用null即可,也可以使用对象实例;而使用实例域的时候,必须提供对象实例。

 package jichu;
/**
*@author 作者 Yu chenchen
*@version 创建时间:2017年4月29日 下午1:32:38
*类说明:
*/
public class User {
public String name;
public static int age;
private double salary; public void print1(){
System.out.println("调用公有非静态print1方法");
}
public static void print2(){
System.out.println("调用公有静态print2方法");
}
private void print3(){
System.out.println("调用私有print3方法");
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static int getAge() {
return age;
}
public static void setAge(int age) {
User.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
 package jichu;

 import java.lang.reflect.Field;

 /**
*@author 作者 Yu chenchen
*@version 创建时间:2017年4月29日 下午12:20:50
*类说明:
*/
public class TestReflectionFields { public void test() throws Exception{
//获取公开实例域
User user = new User();
Field fieldName = User.class.getDeclaredField("name");
//设置实例域值时,必须传入实例对象
fieldName.set(user, "ycc"); //获取静态域
Field fieldAge = User.class.getDeclaredField("age");
//设置静态域值时,传入null
fieldAge.set(null, 25);
//设置静态域值时,也可以传入实例对象
fieldAge.set(user, 26); //获取私有域
Field fieldSalary = User.class.getDeclaredField("salary");
//必须设置可以访问私有域权限
fieldSalary.setAccessible(true);
fieldSalary.set(user,1000.00); System.out.println(user.name);
System.out.println(User.age);
System.out.println(user.getSalary()); }
public static void main(String[] args) {
try {
new TestReflectionFields().test();
} catch (Exception e) {
e.printStackTrace();
}
}
}

输出:

ycc
26
1000.0

获取方法

  4个获取方法:

getMethods() 、 getMethod(methodName)、 getDeclaredMethod(methodName)、  getDeclaredMethods()

 package jichu;

 import java.lang.reflect.Method;

 /**
*@author 作者 Yu chenchen
*@version 创建时间:2017年4月29日 下午1:23:01
*类说明:
*/
public class TestReflectionMethods { public static void main(String[] args) throws Exception {
User user = new User();
//获取公有非静态方法
Method method1 = User.class.getDeclaredMethod("print1");
method1.invoke(user); //获取公有静态方法
Method method2 = User.class.getDeclaredMethod("print2");
method2.invoke((User)null);
//也可以这样
method2.invoke(user); //获取私有方法
Method method3 = User.class.getDeclaredMethod("print3");
//必须设置可以访问私有方法权限
method3.setAccessible(true);
method3.invoke(user); } }

输出:

调用公有非静态print1方法
调用公有静态print2方法
调用公有静态print2方法
调用私有print2方法

Java反射基础(二)的更多相关文章

  1. [Java反射基础二]获取类的信息

    本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...

  2. java反射基础知识(二)

    1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象 ...

  3. java反射基础知识(一)

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  4. 深入解析Java反射基础

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...

  5. java反射基础知识(五)反射应用实践

    详解Java反射各种应用   Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Cl ...

  6. java反射基础知识(四)反射应用实践

    反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...

  7. 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性

    大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...

  8. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  9. Java 反射基础

    1.反射概念: Java运行时,动态获得类的信息以及动态调用对象的方法的功能. 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调 ...

  10. java反射基础知识(三)

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...

随机推荐

  1. java数据库编程:使用元数据分析数据库

    databaseMetaData 使用元数据可以分析数据库基本信息,包括版本,数据库名称,或者指定表的主键. 代码实例 package 类集; import java.sql.Connection ; ...

  2. lsb_release: command not found 解决

    问题:lsb_release 是查看系统版本信息的工具 [root@localhost ~]# lsb_release -a-bash: lsb_release: command not found ...

  3. HTML-HTML5+CSS3权威指南阅读(五、设备像素和CSS像素的概念)

    在这个迷你系列的文章里边我将会解释viewport,以及许多重要元素的宽度是如何工作的,比如<html>元素,也包括窗口和屏幕 这篇文章是关于桌面浏览器的,其唯一目的就是为移动浏览器中相似 ...

  4. PHP-PHP5.3及以上版本中检查json格式的方法

    function is_json($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); } j ...

  5. SQL面试题: 数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列 ,当B列大于C列时选择B列否则选择C列 ,

    1.用一条sql语句 select (case when a>b then a else b end ),(case when b>c then b esle c end)  from 表 ...

  6. python DataFrame获取行数、列数、索引及第几行第几列的值

    print df.columns.size#列数 2 print df.iloc[:,0].size#行数 3 print df.ix[[0]].index.values[0]#索引值 0 print ...

  7. Lintcode---区间求和 I

    给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end] . 对于每个查询,计算出数组中从下标 start 到 end ...

  8. memcache命令行

    memcache运行状态可以方便的用stats命令显示. 首先用telnet 127.0.0.1 11211  [quit 退出]这样的命令连接上memcache,然后直接输入stats就可以得到当前 ...

  9. AngularJS ——ngResource、RESTful APIs 使用

    这篇文章里,用以下两个情景用例来解释: 保存/持久化 新的数据对象 更新存在的数据对象 代码片段包含了AngularJs代码和Spring MVC代码,以能够让你简单快速的上手. 想要$resourc ...

  10. CentOS安装自动补全安装包

    CentOS7标准版有这个功能,但是CentOS6却没有,其实很简单: 1.安装bash-completion yum install bash-completion 2.保存一下最新的缓存 yum ...