Java的反射机制之反向抽烟
show me the code and take to me,做的出来更要说的明白
GitHub项目JavaHouse同步收录
喜欢就点个赞呗! 你的支持是我分享的动力!
引入
反射是一种不按套路处出牌的机制。通常我们接触的方式都是 "正射",暂且起这个名字。虽然我们用的少,但是反射其实就在我们日常开发中。比如我们常见的空指针异常,或者是 Spring 的各种注解配置创建对象等等。
正常操作
ReflectTest reflectTest = new ReflectTest();
reflectTest.setName("boolenbl公众号");
System.out.println(reflectTest.getName());
一般我们使用上面方法创建对象以及初始化属性。并且有严格的访问规则。但是反射就反其道为之。他利用 Class、 Method、 Field等类,随意创建对象,获取公有、私有的方法,获取私有的、共有的方法。
Class 类
Class 类只有私有的构造方法,因此我们不能初始化该对对象,不过 Class 类也不是给我们使用的。 Class 类只能被 JVM 调用。有图有真相:

获取Class 类
有三种方法可以获取到 Class 类。代码如下:
// 方法1
System.out.println(ReflectTest.class);
// 方法2
System.out.println(new ReflectTest().getClass());
// 方法3 包名+类名 (JDBC那种操作) 有异常
System.out.println(Class.forName("基础.ReflectTest"));
// 获取类名
System.out.println(ReflectTest.class.getName());
获取方法
利用该方法可以无视访问规则,获取所有的方法。代码如下:
System.out.println(Arrays.toString(ReflectTest.class.getDeclaredMethods()));
获取属性
利用该方法可以无视访问规则,获取所有的属性。代码如下:
System.out.println(Arrays.toString(ReflectTest.class.getDeclaredFields()));
获取构造器
reflectTestClass.getConstructor();
从正常到异常(反射操作对象)
Class<ReflectTest> reflectTestClass = ReflectTest.class;
Method method = reflectTestClass.getMethod("setName", String.class);
Constructor<ReflectTest> constructor = reflectTestClass.getConstructor();
reflectTest = constructor.newInstance();
method.invoke(reflectTest, "公众号");
System.out.println(reflectTest.getName());
完整代码
package 基础;
import lombok.Data;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* @Description: 反射测试
* @Author: boolean
* @Date: 2019/12/26 17:01
*/
@Data
public class ReflectTest {
private String name;
private String pass;
@Test
public void test() throws NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
/**
* 前提获取 Class 类
*/
// 方法1
System.out.println(ReflectTest.class);
// 方法2
System.out.println(new ReflectTest().getClass());
// 方法3 包名+类名 (JDBC那种操作) 有异常
System.out.println(Class.forName("基础.ReflectTest"));
// 获取类名
System.out.println(ReflectTest.class.getName());
// 获取方法
System.out.println(Arrays.toString(ReflectTest.class.getDeclaredMethods()));
// 获取属性
System.out.println(Arrays.toString(ReflectTest.class.getDeclaredFields()));
// 正常创建对象并初始化
ReflectTest reflectTest = new ReflectTest();
reflectTest.setName("boolenbl公众号");
System.out.println(reflectTest.getName());
// 反射创建对象并初始化
Class<ReflectTest> reflectTestClass = ReflectTest.class;
Constructor<ReflectTest> constructor = reflectTestClass.getConstructor();
reflectTest = constructor.newInstance();
Method method = reflectTestClass.getMethod("setName", String.class);
method.invoke(reflectTest, "公众号");
System.out.println(reflectTest.getName());
}
public void test1(){
}
public void test2(){
}
public void test3(){
}
}
运行结果
class 基础.ReflectTest
class 基础.ReflectTest
class 基础.ReflectTest
基础.ReflectTest
[public boolean 基础.ReflectTest.equals(java.lang.Object), public java.lang.String 基础.ReflectTest.toString(), public int 基础.ReflectTest.hashCode(), public java.lang.String 基础.ReflectTest.getName(), public void 基础.ReflectTest.setName(java.lang.String), public void 基础.ReflectTest.test() throws java.lang.NoSuchMethodException,java.lang.ClassNotFoundException,java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException,java.lang.InstantiationException, protected boolean 基础.ReflectTest.canEqual(java.lang.Object), public void 基础.ReflectTest.test3(), public void 基础.ReflectTest.test2(), public void 基础.ReflectTest.test1(), public java.lang.String 基础.ReflectTest.getPass(), public void 基础.ReflectTest.setPass(java.lang.String)]
[private java.lang.String 基础.ReflectTest.name, private java.lang.String 基础.ReflectTest.pass]
boolenbl公众号
公众号
参考
https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html
sczyh30.com/posts/Java/java-reflection-1/
https://juejin.im/post/598ea9116fb9a03c335a99a4
关注微信公众号,随时移动端阅读

Java的反射机制之反向抽烟的更多相关文章
- java利器------反射机制
java反射的概念:java的反射机制是指在运行状态下,对于一个类来说,可以得到这个类的所有方法和属性.对于一个对象来说,可以调用这个对象的人和方法和属性. 反射机制首先会拿到该类的字节码文件(Cla ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
随机推荐
- 隐写工具F5-steganography的使用
1.git clone https://github.com/matthewgao/F5-steganography 2.进入F5-steganography-master文件夹,在空白处 ctrl+ ...
- maven web报错:org.apache.jasper.JasperException: Unable to compile class for JSP
原博文地址:https://blog.csdn.net/ken1583096683/article/details/80837281 maven web项目启动没问题,访问页面就报错:org.apac ...
- 【New】简•导航 正式上线
[New]简•导航 正式上线 一个简单的导航 链接:http://huangenet.gitee.io/simple/ 欢迎访问⊙ω⊙ 代码托管在码云,访问速度更快哦!
- Oracle使用记录
1.连接数据库的方式 sqlplus system/system@127.0.0.1:1521/orcl #远程用户名密码连接 sqlplus dbsnmp/oracle; #本地用户名密码连接 sq ...
- dbGet
dbGet是Innovus/Encounter DBTCL命令的一种.除了dbGet,DBTCL的命令还包括以下几种: 1. dbSet 2. setDbGetMode/getDbGetMode 3. ...
- Java连载64-finally语法及其注意事项
一.finally语句块 1.注意点: (1)finally语句块可以直接和try语句块联合使用.try...finally.... (2)try.....catch.....finally也可以执行 ...
- Bootstrap环境安装加使用---开启Bootstrap 之旅
1.首先去Bootstrap官网https://getbootstrap.com/上下载Bootstrap 的最新版本 对应的中文页面如下: 下载自己所需要的版本(目前我自己下载的是编译的css和js ...
- redis位图命令
概述 redis 的位图就是01的数据格式,redis 主要做有写入,读取和统计.位图相关的命令 : 其中set和get就是 read 和writer , bitcount 统计相关,bitop 是对 ...
- 作业1:使用go搭建一个web-server
todo1:搭建web-server的原理 todo2:go实现web-server
- Python 报错 AttributeError: module 'django.db.models' has no attribute 'SubfieldBase'
AttributeError: module 'django.db.models' has no attribute 'SubfieldBase' http://www.guanggua.com/qu ...