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的反射机制之反向抽烟的更多相关文章

  1. java利器------反射机制

    java反射的概念:java的反射机制是指在运行状态下,对于一个类来说,可以得到这个类的所有方法和属性.对于一个对象来说,可以调用这个对象的人和方法和属性. 反射机制首先会拿到该类的字节码文件(Cla ...

  2. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  3. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  4. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  5. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  6. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  7. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  8. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  9. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

随机推荐

  1. Vue路由跳转时显示空白页面,iview的使用

    最近在用iview做项目,需要实现登录,注册,忘记密码等功能.iview-admin本来就有登录功能,于是想照葫芦画瓢,实现登录界面的注册,忘记密码页面路由跳转. router.js里路由配置,刚开始 ...

  2. IntelliJ IDEA 2017.3尚硅谷-----创建动态的 Java Web

  3. MVC5+EF6 入门完整教程4 :EF基本的CRUD

    上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model ---> 创建Database Context --->创建databaseInitializer---&g ...

  4. linux零碎001

    glibc:GNU发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc. uclibc:是一个面向嵌入式Linux系统的小型的C标准库.最初 ...

  5. Unity相机鼠标基本控制

    一.滚轮控制视角缩放 /// <summary> /// 滚轮控制相机视角缩放 /// </summary> public void CameraFOV() { //获取鼠标滚 ...

  6. css动画效果之transition(动画效果属性)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 安装VMware Tools和设置屏幕

    在虚拟机窗口的虚拟机-安装VMware Tools,点击安装,直到安装完成,出现以下界面 在主文件夹中新建VM文件夹,将VMware Tools中的VMwareTools-10.0.10-430167 ...

  8. SimpleDateFormat 详解

    转自:http://www.cnblogs.com/yjhrem/articles/2419717.html String time1="2015-10-06"; SimpleDa ...

  9. python浅析对return的理解

    函数外部的代码要想获取函数的执行结果,就可以在函数里面用return语句,把结果返回. return 代表一个函数的终止,如果return 后面带一个print 或者return  ,则后面的不执行 ...

  10. Django - 生成models的UML图

    参考 https://simpleit.rocks/python/django/generate-uml-class-diagrams-from-django-models/ 运用django-ext ...