获取域

  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. 我的Android进阶之旅------>Android字符串资源中的单引號问题error: Apostrophe not preceded by 的解决的方法

    刚刚在string字符串资源文件里,写了一个单引號.报错了,错误代码例如以下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资 ...

  2. 算法笔记_053:最优二叉查找树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 在了解最优二叉查找树之前,我们必须先了解何为二叉查找树? 引用自百度百科一段讲解: 二叉排序树(Binary Sort Tree)又称二叉查找树(B ...

  3. Opengl ES 1.x NDK实例开发之六:纹理贴图

    开发框架介绍请參见:Opengl ES NDK实例开发之中的一个:搭建开发框架 本章在第三章(Opengl ES 1.x NDK实例开发之三:多边形的旋转)的基础上演示怎样使用纹理贴图,分别实现了三角 ...

  4. cookie存中文

    cookie存取: 存: Cookie cookie = new Cookie("title",URLEncoder.encode("标题","utf ...

  5. json servlet通信 显示数据

    servlet //输出JSON格式的省份信息 @WebServlet("/ServletDemo1") public class ServletDemo1 extends Htt ...

  6. bootstrap 警告

    本章将讲解警告(Alerts)以及Bootstrap所提供的用于警告的class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加 ...

  7. 使用C#开发ActiveX控件[Obsolete]

    文章出处:http://www.cnblogs.com/yilin/archive/2009/09/15/1567332.html 附件下载(源代码+安装文件+教程) 0. 前言 ActiveX控件以 ...

  8. .NET面试题(二)

    基础方面: 1.简单的描述一下C# 中重写,重载,隐藏的概念 C#中重写(overide)是子类继承父类后,对父类中的方法进行行为改写. 重载是指方法名相同,参数不同 重写和隐藏的定义: 重写:基类方 ...

  9. SCUT个人整理的常见问题

    1.刚打开redis和服务端,测试时发现明显延时 刚开始会同步数据比较卡,需要进行一次操作才会同步.这个问题暂时没去研究 2.Server failed to start error:The mode ...

  10. Python 函数进阶(filter/map/json/zip)

    一.函数即变量 def say(name): print(name)ybq = say #可以被赋值给其他变量ybq('Amily') #调用函数 函数名:say 函数体:第1-2行 返回值:retu ...