Java反射基础(二)
获取域
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反射基础(二)的更多相关文章
- [Java反射基础二]获取类的信息
本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...
- java反射基础知识(二)
1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象 ...
- java反射基础知识(一)
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...
- java反射基础知识(五)反射应用实践
详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Cl ...
- java反射基础知识(四)反射应用实践
反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...
- 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性
大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- Java 反射基础
1.反射概念: Java运行时,动态获得类的信息以及动态调用对象的方法的功能. 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调 ...
- java反射基础知识(三)
原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...
随机推荐
- selenium-Getting Started
1.1. Simple Usage If you have installed Selenium Python bindings, you can start using it from Python ...
- 【Python】学习笔记八:面向对象
举例 面向对象的合理解释就是:我是人这个类,对象化以后我就是一个个体OLIVER 对象化就是在人这个大类中,将某个人指名道姓,具体到某个人 下面是一个具体的实例一: #!/usr/bin/python ...
- CentOS忘记root密码解决办法
如果是忘记普通的用户密码,那还好说,用root登录命令行界面,修改即可. 但如果是root的话,那就需要这样修改了. 记住,这几篇文章说的都是对的,只是我复杂了,实际只需要将光标移到最后" ...
- sql 语句中 id< ;SELECT * FROM t_blog WHERE id<#{id} ORDER BY id DESC LIMIT 1
- MAC里“微软雅黑”字体标准体和粗体无法同时使用问题的解决方法
微软雅黑字体,有标准体和粗体两种字体,我用的系统是OSX10.9,adobe或者是office软件中,均无法同时使用.要么只能用标准体,粗体报错:要么就是能用粗体,标准体无法使用.很偶然找到了以下MA ...
- Python 统计代码的行数,Python脚本 统计代码
# coding=utf-8 import os import time # 需要统计的文件夹或者文件,这是在windows下运行的,如果使用Linux系统可以使用 basedir = '/app/l ...
- Linux中history历史命令使用方法详解
当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升.事实上,一旦你掌 握了我在下面给出的15个有关Linux history历史命 ...
- WatiN自动化测试
简介 WatiN - Watir的.NET版: http://watin.sourceforge.net/ Welcome at the WatiN (pronounced as What-in) w ...
- ArcGIS教程:Geostatistical Analyst 应用演示样例
Geostatistical Analyst 满足多种不同应用的需求. 下面是 Geostatistical Analyst 的一小部分应用演示样例. 探索性空间数据分析 Geostatistical ...
- HashMap 内部原理
HashMap 内部实现 通过名字便可知道的是,HashMap 的原理就是散列.HashMap内部维护一个 Buckets 数组.每一个 Bucket 封装为一个 Entry<K, V> ...