反射(reflect):

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

获取类对象:

  通过查询API得知:

  

  代码如下:

  

 package com.baidu.reflect.test;
/**
* 测试获取类对象
* @author admin
*
*/ import static org.junit.Assert.*; import org.junit.Test; import com.baidu.reflect.domain.People; public class Test01 { @Test
public void getClass01() throws Exception {
// 实例化对象获取
People p = new People();
Class poeple = p.getClass();
System.out.println(poeple);
// com.baidu.reflect.domain.People
} @Test
public void getClass02() throws Exception {
// className.class获取
Class people = People.class;
System.out.println(people);
} @Test
public void getClass03() throws Exception {
// 完全限定名获取
Class people = Class.forName("com.baidu.reflect.domain.People");
System.out.println(people); }
}

获取构造方法:

  API如下:

 

代码如下

 package com.baidu.reflect.test;

 import java.lang.reflect.Constructor;

 import org.junit.Before;
import org.junit.Test; /**
* 通过反射获取构造方法
*
* @author admin
*
*/
public class Test02 {
// 初始化clazz对象
Class clazz = null; @Before
public void testObject() throws Exception {
// 获取类对象
clazz = Class.forName("com.baidu.reflect.domain.People");
} @Test
public void testGetConstructor01() throws Exception {
// 通过类对象获取无参构造
Constructor constructor = clazz.getConstructor();
// 通过构造获取实例
Object people = constructor.newInstance();
System.out.println(people);// People [name=null, age=0, sex=null] } @Test
public void testGetConstructor02() throws Exception {
// 无参构造可以直接获取实例
Object people = clazz.newInstance();
System.out.println(people);
} @Test
public void testGetConstructor03() throws Exception {
// 通过对象获有参构造
Constructor constructor = clazz.getConstructor(String.class, String.class);
// 获取对象的实例并设置参数
Object people = constructor.newInstance("张三", "男");
System.out.println(people);// People [name=张三, age=0, sex=男]
} @Test
public void testGetConstructor04() throws Exception {
// 通过对象获私有有参构造
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
// 设置访问权限
constructor.setAccessible(true);
// 获取对象的实例并设置参数
Object people = constructor.newInstance("张三", 23, "男");
System.out.println(people);// People [name=张三, age=23, sex=男]
} }

获取成员方法:

  查询API得知:

  

  代码如下

  

 package com.baidu.reflect.test;

 import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import org.junit.Before;
import org.junit.Test; import com.baidu.reflect.domain.People; /**
* 通过反射获取方法 对象
*
* @author admin
*
*/
public class Test03 {
// 初始化clazz对象
Class clazz = null;
People people = null; @Before
public void testObject() throws Exception {
// 获取类对象
clazz = Class.forName("com.baidu.reflect.domain.People");
// 向下转型
people = (People) clazz.newInstance();
} @Test
public void testGetMethod01() throws Exception {
// 通过类对象获取公共方法
Method setNameMethod = clazz.getMethod("setName", String.class);
// 设置方法参数
setNameMethod.invoke(people, "张三");
// 输出people [name=张三, age=0, sex=null]
System.out.println(people + "\r" + "------------");
// 同上
Method getNameMethod = clazz.getMethod("getName");
String name = (String) getNameMethod.invoke(people);
System.out.println(name);// 张三
} @Test
public void testGetMethod02() throws Exception {
// 通过类对象获取私有方法
Method getSayHiMethod = clazz.getDeclaredMethod("sayHi");
getSayHiMethod.setAccessible(true);
// 因为没有返回值:Hello reflect
getSayHiMethod.invoke(people); } }

获取成员变量:

  API:

  

  

  代码:

  

 package com.baidu.reflect.test;

 import java.lang.reflect.Field;

 import org.junit.Before;
import org.junit.Test; import com.baidu.reflect.domain.People; /**
* 通过反射获取成员变量
*
* @author admin
*
*/
public class Test04 {
// 初始化clazz对象
Class clazz = null;
People people = null; @Before
public void testObject() throws Exception {
// 获取类对象
clazz = Class.forName("com.baidu.reflect.domain.People");
// 向下转型
people = (People) clazz.newInstance();
} @Test
public void testGetField01() throws Exception {
// 通过类对象获取private field;
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(people, "张三");
System.out.println(people);// People [name=张三, age=0, sex=null] } @Test
public void testGetField02() throws Exception {
// 通过类对象获取public field
Field sexField = clazz.getField("sex");
sexField.set(people, "未知");
System.out.println(people);// People [name=null, age=0, sex=未知] } }

实体类:

  

 package com.baidu.reflect.domain;

 /**
* 实体
*
* @author admin
*
*/
public class People { private String name;
private int age;
public String sex; public People() {
} private People(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
} public People(String name, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} private void sayHi() {
System.out.println("Hello reflect");
} @Override
public String toString() {
return "People [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}

希望能给大家一个参考,也希望大家多多支持我。

查阅文献:    https://baike.baidu.com/item/JAVA反射机制/6015990?

简单理解Java的反射的更多相关文章

  1. 七分钟理解 Java 的反射 API

    像java一样,一种具有反射功能的语言.允许开发人员在运行时检查类型.方法.字段.注解等,并在程序运行时决定是否使用. 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他. 使用它 ...

  2. 深入理解Java的反射机制

    https://blog.csdn.net/u012585964/article/details/52011138 http://www.importnew.com/20339.html 一,java ...

  3. 理解Java的反射与内省及其区别

    java的内省机制和反射机制什么区别 内省操作只针对JavaBean,只有符合JavaBean规则的类的成员才可以采用内省API进行操作....而反射则不同,一个类的所有成员都可以进行反射操作. 内省 ...

  4. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  5. 简单理解java中timer的schedule和scheduleAtFixedRate方法的区别

    timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老 ...

  6. 利用Java的反射与代理机制实现AOP

    在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...

  7. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

    一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...

  8. 深入理解Java反射+动态代理

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

  9. java基础强化——深入理解java注解(附简单ORM功能实现)

    目录 1.什么是注解 2. 注解的结构以及如何在运行时读取注解 2.1 注解的组成 2.2 注解的类层级结构 2.3 如何在运行时获得注解信息 3.几种元注解介绍 3.1 @Retention 3.2 ...

随机推荐

  1. 关于ML.NET v1.0 RC的发布说明

    ML.NET是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS).使用ML.NET,开发人员可以利用他们现有的工具和技能组,通过为情感分析,推荐,图像分类等常见场 ...

  2. 2018年Fintech金融科技关键词和入行互金从业必懂知识

    2018年过去大半,诸多关键词进入眼帘: 5G,消费降级,数据裸奔,新零售,AI,物联网,云计算,合规监管,风控,割韭菜,区块链,生物识别,国民空闲时间以及金融科技. 这些词充斥着我们的生活和时间,而 ...

  3. ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

    在大部分程序中一般都会需要用到后台任务, 比如定时更新缓存或更新某些状态.(ASP.NET Core 系列目录) 一.应用场景 以调用微信公众号的Api为例, 经常会用到access_token,官方 ...

  4. HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码

    HttpServletResponse  和 ServletResponse  都是接口 具体的类型对象是由Servlet容器传递过来   ServletResponse对象的功能分为以下四种:   ...

  5. NiftyNet 数据预处理

    NiftyNet项目介绍 使用NiftyNet时,我们需要先将图像数据和标签进行一次简单的处理,得到对应的.csv文件. 对应文件格式为: img.csv image path img_name im ...

  6. WPF中Datagrid控件添加行号

    /// <summary> /// 导入Excel文件按钮 /// </summary> /// <param name="sender">&l ...

  7. 【.Net Core】处理静态文件

    静态文件存储在项目的 Web 根目录中. 默认目录是 <content_root>/wwwroot,但可通过 UseWebRoot 方法更改目录. public class Program ...

  8. springboot之多数据源配置JdbcTemplate

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...

  9. sublime前端必备插件

    1,docblockr     javascr 和 CSS快捷注释插件 在javascript中  写出函数后,/**+回车 就会出现下面函数注释补全. -----/** * @param {[typ ...

  10. 点击checkbox后,$(this).attr('checked')得到的值不会发生改变

    这两天遇到一个问题,就是在点击checkbox后,$(this).attr('checked')得到的值要么是undefined,要么是checked,同一个表单一直点击却一点都不会发生改变,调试了一 ...