反射(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. 开发环境配置:jdk8的详细安装教程&&tomact的详细安装教程&&java环境变量的配置&&tomcat启动总失败原因

    1.下载 链接: http://pan.baidu.com/s/1i57HZKx 密码: cnb4 2.详细安装过程 3.下载地址 链接: http://pan.baidu.com/s/1mi6VUp ...

  2. JQ 放大镜

     <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title> ...

  3. 【offer收割机必备】我简历上的Java项目都好low,怎么办?

    这篇文章我们来聊一聊,在系统设计和项目经验这两块,应该如何充分的准备,才能拿出有技术含量的项目经验战胜跟你同台竞技的其他工程师,征服你的面试官,收获各种心仪的offer. (1)高级工程师必备:系统设 ...

  4. 仓储模式Repository的选择与设计

    首次接触仓储的概念来自Eric Evans 的经典著作<领域驱动设计-软件核心复杂性应对之道>,但书中没有具体实现.如何实现仓储模式,在我这几年的使用过程中也积累了一些具体的实施经验.根据 ...

  5. 洛谷:P1182:数列分段`Section II`

    题目描述 对于给定的一个长度为N的正整数数列 A-iA−i ,现要将其分成 M(M≤N)M(M≤N) 段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列 4 2 4 5 1424 ...

  6. 如何比较版本号--Python实现

    需求 在写一个程序Django项目的setup程序(初始化环境,比如设置PIP源,安装该项目依赖的各种模块等操作)遇到一个系统当前模块版本和项目所需版本的比较然后给出建议是忽略还是升级.我的要求是不仅 ...

  7. 前端笔记之HTML5&CSS3(中)选择器&伪类伪元素&CSS3效果&渐变背景&过渡

    一.CSS3选择器 CSS3是CSS的第三代版本,新增了很多功能,例如:强大的选择器.盒模型.圆角.渐变.动画.2D/3D转换.文字特效等. CSS3和HTML5没有任何关系!HTML5骨架中,可以用 ...

  8. mysql锁机制详解

    前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机 ...

  9. 阿里云弹性容器实例产品 ECI ——云原生时代的基础设施

    阿里云弹性容器实例产品 ECI ——云原生时代的基础设施 1. 什么是 ECI 弹性容器实例 ECI (Elastic Container Instance) 是阿里云在云原生时代为用户提供的基础计算 ...

  10. 监控mysql

    Mysql服务器监控 管理MySql服务器属于应用程序监控范畴.这是因为绝大多数性能参数是有MySql软件产生的,而不属于主操作系统的一部分. 如当前所提到的,应该总是先监控基础操作系统,然后监控My ...