获取域

  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. selenium-Getting Started

    1.1. Simple Usage If you have installed Selenium Python bindings, you can start using it from Python ...

  2. 【Python】学习笔记八:面向对象

    举例 面向对象的合理解释就是:我是人这个类,对象化以后我就是一个个体OLIVER 对象化就是在人这个大类中,将某个人指名道姓,具体到某个人 下面是一个具体的实例一: #!/usr/bin/python ...

  3. CentOS忘记root密码解决办法

    如果是忘记普通的用户密码,那还好说,用root登录命令行界面,修改即可. 但如果是root的话,那就需要这样修改了.   记住,这几篇文章说的都是对的,只是我复杂了,实际只需要将光标移到最后" ...

  4. sql 语句中 id&lt ;SELECT * FROM t_blog WHERE id<#{id} ORDER BY id DESC LIMIT 1

  5. MAC里“微软雅黑”字体标准体和粗体无法同时使用问题的解决方法

    微软雅黑字体,有标准体和粗体两种字体,我用的系统是OSX10.9,adobe或者是office软件中,均无法同时使用.要么只能用标准体,粗体报错:要么就是能用粗体,标准体无法使用.很偶然找到了以下MA ...

  6. Python 统计代码的行数,Python脚本 统计代码

    # coding=utf-8 import os import time # 需要统计的文件夹或者文件,这是在windows下运行的,如果使用Linux系统可以使用 basedir = '/app/l ...

  7. Linux中history历史命令使用方法详解

    当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌 握了我在下面给出的15个有关Linux history历史命 ...

  8. WatiN自动化测试

    简介 WatiN - Watir的.NET版: http://watin.sourceforge.net/ Welcome at the WatiN (pronounced as What-in) w ...

  9. ArcGIS教程:Geostatistical Analyst 应用演示样例

    Geostatistical Analyst 满足多种不同应用的需求. 下面是 Geostatistical Analyst 的一小部分应用演示样例. 探索性空间数据分析 Geostatistical ...

  10. HashMap 内部原理

    HashMap 内部实现 通过名字便可知道的是,HashMap 的原理就是散列.HashMap内部维护一个 Buckets 数组.每一个 Bucket 封装为一个 Entry<K, V> ...