【设计模式】Java设计模式 - 反射机制

不断学习才是王道

继续踏上学习之路,学之分享笔记

总有一天我也能像各位大佬一样

一个有梦有戏的人 @怒放吧德德

Java反射技术

反射的应用机制广泛,能够配置类的全限定名(包名 + 类型名)、方法和参数,完成对象的初始化,并且可以大大增强Java的可配置性,SpringIOC的基本原理就是如此。

1、通过反射构建对象

反射构建对象可以是有参和无参。

无参:

先定义ReflectDemo类,并且有个无参数的方法。

public class ReflectDemo {
public void sayHello() {
System.out.println("反射机制!!!");
}
}

通过反射去构建对象

// 通过反射去构建
public ReflectDemo getInstance() {
ReflectDemo object = null;
try {
object = (ReflectDemo) Class.forName("com.lyd.demo.reflect.ReflectDemo").newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}

其实就是通过ClassforName()去找到这个类,在通过newInstance()方法创建实例。

给类加载器去注册了一个类ReflectDemo的全限定名

object = (ReflectDemo) Class.forName("com.lyd.demo.reflect.ReflectDemo").newInstance();

含参:

先定义ReflectParamDemo类,并且有个含参数的方法以及其构造方法。

public class ReflectParamDemo {
private String name;
private int age; public ReflectParamDemo(String name, int age) {
this.name = name;
this.age = age;
} public void sayHello(String name, int age) {
System.out.println("名字: " + name + " 年龄: " + age);
}
}

同样,根据Class.forName去创建实例,但是需要注意的是,需要加上参数。

// 通过反射去构建
public ReflectParamDemo getInstance() {
ReflectParamDemo object = null;
try {
object = (ReflectParamDemo) Class.forName("com.lyd.demo.reflect.ReflectParamDemo")
.getConstructor(String.class, int.class)
.newInstance("李四", 18);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}

getConstructor(),带入参数类型

object = (ReflectParamDemo) Class.forName("com.lyd.demo.reflect.ReflectParamDemo")

.getConstructor(String.class, int.class)

.newInstance("李四", 18);

2、反射方法

无参:

暂时先演示反射方法,所以用new的方法来创建实例target,具体的代码请看实例, 通过ReflectDemo.class.getMethod("sayHello");可以获取到类中的方法,并且通过invoke加粗样式方法完成。

//反射方法
public Object reflectMethod() {
Object retuenObj = null;
ReflectDemo target = new ReflectDemo();
try {
Method method = ReflectDemo.class.getMethod("sayHello");
retuenObj = method.invoke(target);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return retuenObj;
}

target: 指定对象

invoke(target):调用哪个对象中的方法,如果是含参的,可以在后面添加参数,可以是多个参数

3、实例:

综合反射对象与方法

无参:

//实例
public static Object reflect() {
ReflectDemo object = null;
try {
object = (ReflectDemo) Class.forName("com.lyd.demo.reflect.ReflectDemo").newInstance();
Method method = ReflectDemo.class.getMethod("sayHello");
method.invoke(object);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return object;
}

含参:

//实例
public static Object reflect() {
ReflectParamDemo object = null;
try {
object = (ReflectParamDemo) Class.forName("com.lyd.demo.reflect.ReflectParamDemo")
.getConstructor(String.class, int.class)
.newInstance("李四", 18);
Method method = ReflectParamDemo.class.getMethod("sayHello", String.class, int.class);
method.invoke(object, "李四", 18);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return object;
}

总体代码

ReflectDemo:

package com.lyd.demo.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* @Author: lyd
* @Description: 反射机制-无参数
* @Date: 2022-08-14
*/
public class ReflectDemo {
public void sayHello() {
System.out.println("反射机制!!!");
} // 通过反射去构建
public ReflectDemo getInstance() {
ReflectDemo object = null;
try {
object = (ReflectDemo) Class.forName("com.lyd.demo.reflect.ReflectDemo").newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
} //反射方法
public Object reflectMethod() {
Object retuenObj = null;
ReflectDemo target = new ReflectDemo();
try {
Method method = ReflectDemo.class.getMethod("sayHello");
retuenObj = method.invoke(target);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return retuenObj;
} //实例
public static Object reflect() {
ReflectDemo object = null;
try {
object = (ReflectDemo) Class.forName("com.lyd.demo.reflect.ReflectDemo").newInstance();
Method method = ReflectDemo.class.getMethod("sayHello");
method.invoke(object);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return object;
}
}

ReflectParamDemo:

package com.lyd.demo.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; /**
* @Author: lyd
* @Description: 反射机制-带参数
* @Date: 2022-08-14
*/
public class ReflectParamDemo {
private String name;
private int age; public ReflectParamDemo(String name, int age) {
this.name = name;
this.age = age;
} public void sayHello(String name, int age) {
System.out.println("名字: " + name + " 年龄: " + age);
} // 通过反射去构建
public ReflectParamDemo getInstance() {
ReflectParamDemo object = null;
try {
object = (ReflectParamDemo) Class.forName("com.lyd.demo.reflect.ReflectParamDemo")
.getConstructor(String.class, int.class)
.newInstance("李四", 18);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
} //实例
public static Object reflect() {
ReflectParamDemo object = null;
try {
object = (ReflectParamDemo) Class.forName("com.lyd.demo.reflect.ReflectParamDemo")
.getConstructor(String.class, int.class)
.newInstance("李四", 18);
Method method = ReflectParamDemo.class.getMethod("sayHello", String.class, int.class);
method.invoke(object, "李四", 18);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return object;
}
}

测试:ReflectTest

package com.lyd.demo.reflect;

/**
* @Author: lyd
* @Description: 反射机制测试
* @Date: 2022-08-14
*/
public class ReflectTest {
public static void main(String[] args) {
ReflectDemo.reflect();
ReflectParamDemo.reflect();
}
}

结果:

【设计模式】Java设计模式 - 反射机制的更多相关文章

  1. Java的反射机制和动态代理

    介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...

  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反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  10. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

随机推荐

  1. 记一次grpc server内存/吞吐量优化

    背景 最近,上线的采集器忽然时有OOM.采集器本质上是一个grpc服务,网络设备通过grpc协议将数据上报后,采集器进行格式等整理后,发往下一个系统(比如分析,存储). 打开运行环境,发现特性如下: ...

  2. SAP Display picture

    program sap_picture_demo. set screen 200. TYPE-POOLS cndp. ***************************************** ...

  3. List集合五种遍历方式

    一.使用Iterator接口遍历 二.普通for循环遍历 三.增强for循环遍历 四.List集合自带迭代器 五.Lambda(JDK8新增特性) //使用多态方式创建对象 List<Strin ...

  4. Git下载(快速快速快速下载!!)

    在安装Git环境的时候,需要下载Git的安装包,但是官网的下载网速实在是太慢的(几十M的安装包,下载速度只有几十K) (所以可以在镜像中下载,速度超快) Git镜像下载链接-------------- ...

  5. RASP | 远程Java应用的RASP调试教程

    远程Java应用的RASP调试教程 介绍 Java RASP是基于Java Agent技术实现的,而Java Agent代码无法独立启动,必须依赖于一个Java运行时程序才能运行. 如何调试一个Jav ...

  6. 强化学习-学习笔记4 | Actor-Critic

    Actor-Critic 是价值学习和策略学习的结合.Actor 是策略网络,用来控制agent运动,可以看做是运动员.Critic 是价值网络,用来给动作打分,像是裁判. 4. Actor-Crit ...

  7. vim插件pathogen的Helptags不起作用

    如果你安装了中文vim帮助,并且在其中添加了自己的帮助文件,并且当你使用了pathogen的时候. 会发现Helptags不起作用. 原因是Helptags的实现没有考虑到中文的情况 解决办法如下: ...

  8. Tapdata x 轻流,为用户打造实时接入轻流的数据高速通道

      在全行业加速布局数字化的当口,如何善用工具,也是为转型升级添薪助力的关键一步.   那么当轻量的异构数据实时同步工具,遇上轻量的数字化管理工具,将会收获什么样的新体验?此番 Tapdata 与轻流 ...

  9. 构建 API 的7个建议【翻译】

    迄今为止,越来越多的企业依靠API来为客户提供服务,以确保竞争的优势和业务可见性.出现这个情况的原因是微服务和无服务器架构正变得越来越普遍,API作为其中的关键节点,继承和承载了更多业务. 在这个前提 ...

  10. 分享|2022数字安全产业大数据白皮书(附PDF)

    内容摘要: 2021年以来,数字安全赛道的受关注程度达到一个历史新高度.<数据安全法><个人信息保护法><关键信息基础设施安全保护条例>,一个接一个重磅的法规接连出 ...