java反射构建对象和方法的反射调用

简介: java反射构建对象和方法的反射调用Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法。可以增强java的可配置性。1.1 通过反射构建对象(无参数):  例如我们使用 ReflectServiceImpl 类讲解这个例子1 public class ReflectServiceImpl {2 public void sayHello(String name){3 System.out.println("hello"+name);4 }5 }我们通过反射的方法去构建它。

java反射构建对象和方法的反射调用
Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法。可以增强java的可配置性。

1.1 通过反射构建对象(无参数):

  例如我们使用 ReflectServiceImpl 类讲解这个例子

1 public class ReflectServiceImpl {
2 public void sayHello(String name){
3 System.out.println("hello"+name);
4 }
5 }
我们通过反射的方法去构建它。

复制代码
1 public ReflectServiceImpl getInstance(){
2 ReflectServiceImpl object=null;
3 try {
4 object=(ReflectServiceImpl)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
5 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
6 e.printStackTrace();
7 }
8 return object;
9 }
复制代码
其中第4行:object=(ReflectServiceImpl)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();

是给类加载器注册一个类ReflectServiceImpl的权限定名,之后通过newInstance方法初始化一个类对象。

1.2 通过反射构建对象(类的构造器中带有参数):

我们使用ReflectServiceImpl2这个类去理解:

复制代码
1 public class ReflectServiceImpl2 {
2 private String name;
3 public ReflectServiceImpl2(String name) {
4 this.name=name;
5 }
6 public void sayHello(String name){
7 System.out.println("hello"+name);
8 }
9 }
复制代码
此时 ReflectServiceImpl2的构造器带有参数 public ReflectServiceImpl2(String name){xxxx};

此时我们该如何利用反射生成对象呢?只需要在类加载器注册的使用getConstructor(参数)方法。其中参数是我们构造器中的参数的类型。代码如下:

复制代码
1 public ReflectServiceImpl2 getInstance(){
2 ReflectServiceImpl2 object=null;
3 try {
4 object=(ReflectServiceImpl2)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl2")
5 .getConstructor(String.class).newInstance("张三");
6 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | InvocationTargetException |NoSuchMethodException e) {
7 e.printStackTrace();
8 }
9 return object;
10 }
复制代码
如4、5行所示:

  先通过forName加载到类的加载器。然后通过getConstructor方法,它的参数可以是多个,这里定义String.class,意为有且只有一个参数类型为String 的构建方法。通过这个方法可以对重名方法进行排除,此时再用newInstance方法生成对象,只是newInstance方法也多了一个参数“张三”而已。实际上就等于object=new ReflectServiceImpl2("张三").只是利用了反射来生成对象而已。

1.3 反射方法

  在使用反射方法之前需要先获取对象,得到了方法才能够去反射。

我们使用 ReflectServiceImpl 类为例。

ReflectServiceImpl 类代码:

1 public class ReflectServiceImpl {
2 public void sayHello(String name){
3 System.out.println("hello"+name);
4 }
5 }
调用方法:

复制代码
1 public Object reflect(){
2 ReflectServiceImpl object=null;
3 Object returnObj=null;
4 //反射生成对象
5 try {
6 object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
7 //反射生成方法并调度
8 Method method = object.getClass().getMethod("sayHello", String.class);
9 returnObj= method.invoke(object, "张三");
10 }catch( ClassNotFoundException| NoSuchMethodException| InvocationTargetException| IllegalAccessException| InstantiationException e ) {
11 e.printStackTrace();
12 }
13 return returnObj;
14 }
复制代码
当有具体对象 object(类型为ReflectServiceImpl),而不知道具体是哪个类的时候,也可以使用object.getClass().getMethod("sayHello", String.class);来替代它,其中第一个参数是方法的名称,第二个参数是参数类型,是一个列表,多个参数可以继续编写多个类型,这样便能够获得反射的方法对象。反射方法时运用 method.invoke(object, "张三");调用的,第一个参数为object,就是确定用哪个对象调用方法,而“张三”是参数,这就等同于object.sayHello("张三");若存在多个参数可以写成Method.invoke(target,obj1,obj2.obj3...),这些要根据对象的具体方法来确定。

1.4 测试

以ReflectServiceImpl为例:

复制代码
1 package com.lean.reflect;
2 import java.lang.reflect.InvocationTargetException;
3 import java.lang.reflect.Method;
4 public class ReflectServiceImpl {
5 //属性
6 private String name;
7 //默认的构造方法
8 public ReflectServiceImpl() {
9 super();
10 }
11 //带参数的构造方法
12 public ReflectServiceImpl(String name) {
13 this.name=name;
14 }
15 //方法 sayHelo
16 public void sayHello(String name){
17 System.out.println("hello "+name);
18 }
19 //调用方法
20 public Object reflect(){
21 ReflectServiceImpl object=null;
22 Object returnObj=null;
23 //反射生成对象
24 try {
25 object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
26 //反射生成方法并调度
27 Method method = object.getClass().getMethod("sayHello", String.class);
28 returnObj= method.invoke(object, "张三");
29 }catch( ClassNotFoundException| NoSuchMethodException| InvocationTargetException| IllegalAccessException| InstantiationException e ) {
30 e.printStackTrace();
31 }
32 return returnObj;
33 }
34 //获取对象
35 public ReflectServiceImpl getInstance(){
36 ReflectServiceImpl object=null;
37 try {
38 object=(ReflectServiceImpl)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
39 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
40 e.printStackTrace();
41 }
42 return object;
43 }
44 //测试
45 public static void main(String[] args) {
46 ReflectServiceImpl rsl= new ReflectServiceImpl();
47 rsl.reflect();
48 }
49 }
复制代码
效果图:

原文地址https://www.cnblogs.com/zyxsblogs/p/11225233.html

相关文章
|
27天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
52 11
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
91 9
|
5天前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
23 15
|
18天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
2月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
70 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
55 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
72 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
30 1
|
2月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。