反射(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. mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)

    一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库 ...

  2. ActivityLifecycleCallbacks 的简单使用

    转载自 http://blog.csdn.net/tongcpp/article/details/40344871 ActivityLifecycleCallbacks是什么? Application ...

  3. 一文看懂https如何保证数据传输的安全性的

    通过漫画的形式由浅入深带你读懂htts是如何保证一台主机把数据安全发给另一台主机的 对称加密 一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端.之后服务器给客户端发送真实数 ...

  4. Chapter 5 Blood Type——13

    "Kryptonite doesn't bother me, either," he chuckled. “氪星石也不会影响我,” 他笑着说道. "You're not ...

  5. Asp.Net SignalR - 简单聊天室实现

    简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...

  6. Docker系列02—LXC---Docker的“前身”

    本文收录在容器技术学习系列文章总目录 一.LXC介绍 1.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源. 2.LXC为Linux Containe ...

  7. java内置线程池ThreadPoolExecutor源码学习记录

    背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX ...

  8. tomcat使用详解(week4_day2)--技术流ken

    tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发 ...

  9. plsql的database下拉为空,如何解决?

    如何解决plsql的database下拉为空? 为什么plsql的database下拉为空?我在tnsnames.ora中设置了字符串ORCL,疑惑了我好久,在网上找了许久解决方案,终于是解决了!如下 ...

  10. web中的——作者也不知道这里面写的啥

    1.使用超链接<a href="/Default/Index">添加</a><a href="#">返回显示信息</a ...