反射(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. 从源码分析如何优雅的使用 Kafka 生产者

    前言 在上文 设计一个百万级的消息推送系统 中提到消息流转采用的是 Kafka 作为中间件. 其中有朋友咨询在大量消息的情况下 Kakfa 是如何保证消息的高效及一致性呢? 正好以这个问题结合 Kak ...

  2. vue踩坑--TypeError: __WEBPACK_IMPORTED_MODULE_1_vuex__.a.store is not a constructor

    今天在使用vuex的时候遇到这么个问题,虽然后来解决了,是首字母大写的原因,但我还是不知道为什么.这里先记录下来. 这是vuex/store.js import Vue from 'vue' impo ...

  3. Config ConnectionStrings

    <connectionStrings> <add name ="MyschoolConnectionString" connectionString =" ...

  4. golang子进程的启动和停止,mac与linux的区别

    今天接到一个任务是将原来运行在mac的应用移植到linux,原因当然是因为客户那边当前是linux环境,也不想再采购mac电脑. 通常来说,这个工作并不难,因为我选用的服务器端技术是c或者golang ...

  5. 《HelloGitHub月刊》第 05 期

    <HelloGitHub>第 05 期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 欢迎各路人士加入本项目,丰富月刊的内容,也可以直接在Issue(需要登录 ...

  6. 从零打卡leetcode之day 2---两数相加

    前言 就是要把leetcode刷完,每天一道题,每天进步一点点. 从零打卡leetcode之day 2 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储, 它们的每个节点只存储单个 ...

  7. Chapter 5 Blood Type——6

    "Yes — giving up trying to be good. I'm just going to do what I want now, and let the chips fal ...

  8. 认识浏览器请求头User-Agent

    一.定义 User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA. 它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本.操 ...

  9. linux rsync 实际应用

    linux rsync 实际应用 一.rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和 ...

  10. 产品炼成记·hostingranking.cn·基于ghost的轻量技术架构整理

    本篇纯粹只讲hostingranking.cn网站的技术架构,也就是怎么做到的,达到什么效果.至于它是什么,为什么要做暂且不说,另篇会分享. 技术组成 首先hostingranking.cn是基于gh ...