java反射详解

动态代理

  • 什么是动态代理?

    特点:无侵入式的给代码增加额外的功能

    对象有什么方法想要被代理,代理就一定要有对应的方法

    对象和代理需要实现同一个接口,接口中就是被代理的方法

    调用者通过代理,调用代理中的方法,代理再去调用对象的方法

    //为对象生产代理对象的方法
    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interface,InvocationHandler h){参数一:用于指定用哪个类加载器,去加载生成的代理类参数二:指定接口,这些接口用于指定生成的代理长什么样,也就是有哪些方法参数三:用来指定生成的代理对象要干什么事情
    }
    

    对象:

    package bean;public class BigStar implements Star {String name;//明星的名字@Overridepublic String toString() {return "BigStar{" +"name='" + name + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigStar() {}public BigStar(String name) {this.name = name;}@Overridepublic void sing(String name) {System.out.println(this.name + "在唱歌");}@Overridepublic void dance() {System.out.println(this.name + "在跳舞");}
    }

    接口:

    package bean;public interface Star {public abstract void sing(String name);//参数为歌名public void dance();
    }

    代理:

    package bean;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;public class ProxyUtil {public static Star createProxy(BigStar bigStar){Star star = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/** 参数一:被代理的对象* 参数二:要运行的方法* 参数三:调用方法时,传递的实参** */if("sing".equals(method.getName())){System.out.println("准备场地,开始唱歌");}else if("dance".equals(method.getName())){System.out.println("准备场地,开始跳舞");}return method.invoke(bigStar,args);//调用对象的方法}});return star;}
    }

    测试:

    package bean;public class Test {public static void main(String[] args) {//获取代理对象BigStar bigStar = new BigStar("鸡哥");Star proxy = ProxyUtil.createProxy(bigStar);//调用方法proxy.sing("只因你太美");proxy.dance();}
    }

    结果

    在这里插入图片描述

反射

反射允许对封装类的字段,方法,和构造函数的信息进行编程的访问

获取class对象的三种方法

  • Class.forName(“全类名”);全类名:包名+类名

    最为常用

  • 类名.class

    一般更多的是当作参数传递

  • 对象.getClass()

    有一定的局限性,当我们已经有了该类的对象才可以使用

反射获取构造方法

获取Class对象Class
构造方法constructor
字段(成员变量)Field
成员方法Method
package bean;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;public class MyReflect {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//获取字节码文件对象Class clazz = Class.forName("bean.Student");//获取构造方法System.out.println("获取所有的public修饰的构造方法");Constructor[] constructors = clazz.getConstructors();for(Constructor c : constructors){System.out.println(c);}System.out.println("获取所有的构造方法");Constructor[] declaredConstructor = clazz.getDeclaredConstructors();for(Constructor c : declaredConstructor){System.out.println(c);}System.out.println("获取单个的构造方法(空参构造)");Constructor declaredConstructor1 = clazz.getDeclaredConstructor();System.out.println(declaredConstructor1);System.out.println("获取单个构造方法(一个参数的,该参数为形参的字节码)");Constructor declaredConstructor2 = clazz.getDeclaredConstructor(String.class);System.out.println(declaredConstructor2);Constructor declaredConstructor3 = clazz.getDeclaredConstructor(String.class, int.class);System.out.println(declaredConstructor3);System.out.println("获取权限修饰符");int modifiers = declaredConstructor3.getModifiers();System.out.println("权限修饰符:"+modifiers);System.out.println("获取参数类型");Parameter[] parameters = declaredConstructor3.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}System.out.println("创建对象");Object stu = declaredConstructor3.newInstance("张三", 18);System.out.println(stu);//临时取消权限校验:class.setAccessible(true)}
}

输出结果

获取所有的public修饰的构造方法
public bean.Student(java.lang.String,int)
public bean.Student(int)
public bean.Student()
获取所有的构造方法
public bean.Student(java.lang.String,int)
public bean.Student(int)
protected bean.Student(java.lang.String)
public bean.Student()
获取单个的构造方法(空参构造)
public bean.Student()
获取单个构造方法(一个参数的,该参数为形参的字节码)
protected bean.Student(java.lang.String)
public bean.Student(java.lang.String,int)
获取权限修饰符
权限修饰符:1
获取参数类型
java.lang.String arg0
int arg1
创建对象
Student{name='张三', age=18}

在java中权限修饰符是用整数来表示的,如图所示:public == 1,private= == 2

在这里插入图片描述
)

反射获取成员变量

package bean;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
import java.sql.SQLOutput;public class MyReflect {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//获取字节码文件对象Class clazz = Class.forName("bean.Student");System.out.println("获取所有成员变量");Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}System.out.println("获取所有的公共的成员变量");Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);}System.out.println("获取单个成员变量");Field name = clazz.getField("name");System.out.println(name);System.out.println("获取成员变量的权限修饰符");int modifiers = name.getModifiers();System.out.println(modifiers);System.out.println("获取成员变量名:");System.out.println(name.getName());System.out.println("获取数据类型");Class<?> type = name.getType();System.out.println(type);Student s = new Student("张三",18);System.out.println("获取成员变量的值");Object val = name.get(s);System.out.println(val);System.out.println("修改变量的值");name.set(s,"李四");Object val2 = name.get(s);System.out.println(val2);}
}

输出结果:

获取所有成员变量
public java.lang.String bean.Student.name
private int bean.Student.age
获取所有的公共的成员变量
public java.lang.String bean.Student.name
获取单个成员变量
public java.lang.String bean.Student.name
获取成员变量的权限修饰符
1
获取成员变量名:
name
获取数据类型
class java.lang.String
获取成员变量的值
张三
修改变量的值
李四

获取成员方法

实例代码:

package bean;import java.lang.reflect.*;
import java.sql.SQLOutput;public class MyReflect {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//获取字节码文件对象Class clazz = Class.forName("bean.Student");System.out.println("获取所有的public方法对象,包括父类中的公共方法");Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println("获取本类所有的方法包含私有的方法(不能获取父类的)");Method[] declaredMethods = clazz.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}System.out.println("获取指定方法");Method eat = clazz.getMethod("eat", String.class);System.out.println(eat);System.out.println("获取方法的修饰符");int modifiers = eat.getModifiers();System.out.println(modifiers);System.out.println("获取方法的名字");String name = eat.getName();System.out.println(name);System.out.println("获取方法的形参");Parameter[] parameters = eat.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}System.out.println("获取方法的返回值");Class<?> returnType = eat.getReturnType();System.out.println(returnType);System.out.println("获取方法的抛出的异常");Class[] exceptionTypes = eat.getExceptionTypes();for (Class exceptionType : exceptionTypes) {System.out.println(exceptionType);}System.out.println("方法的运行。。。。");Student stu = new Student("张三",18);/*invoke方法中:第一个参数:用obj对象调用该方法,方法的调用者第二个参数:调用该方法传递的参数(没有就不写)返回值:没有就不写*/Object res = eat.invoke(stu, "酸菜");//返回值为该方法的返回值System.out.println(res);}
}

运行结果:

获取所有的public方法对象,包括父类中的公共方法
public java.lang.String bean.Student.getName()
public java.lang.String bean.Student.toString()
public void bean.Student.setName(java.lang.String)
public int bean.Student.getAge()
public java.lang.String bean.Student.eat(java.lang.String) throws java.io.IOException,java.lang.NullPointerException,java.io.FileNotFoundException
public void bean.Student.setAge(int)
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
获取本类所有的方法包含私有的方法(不能获取父类的)
public java.lang.String bean.Student.getName()
public java.lang.String bean.Student.toString()
private void bean.Student.sleep()
public void bean.Student.setName(java.lang.String)
public int bean.Student.getAge()
public java.lang.String bean.Student.eat(java.lang.String) throws java.io.IOException,java.lang.NullPointerException,java.io.FileNotFoundException
public void bean.Student.setAge(int)
获取指定方法
public java.lang.String bean.Student.eat(java.lang.String) throws java.io.IOException,java.lang.NullPointerException,java.io.FileNotFoundException
获取方法的修饰符
1
获取方法的名字
eat
获取方法的形参
java.lang.String arg0
获取方法的返回值
class java.lang.String
获取方法的抛出的异常
class java.io.IOException
class java.lang.NullPointerException
class java.io.FileNotFoundException
方法的运行。。。。
吃酸菜
吃饱了
  • 反射的作用

    获取一个类的所有信息,得到信息之后,再去执行其他的业务逻辑

lic java.lang.String bean.Student.eat(java.lang.String) throws java.io.IOException,java.lang.NullPointerException,java.io.FileNotFoundException
获取方法的修饰符
1
获取方法的名字
eat
获取方法的形参
java.lang.String arg0
获取方法的返回值
class java.lang.String
获取方法的抛出的异常
class java.io.IOException
class java.lang.NullPointerException
class java.io.FileNotFoundException
方法的运行。。。。
吃酸菜
吃饱了


* 反射的作用获取一个类的所有信息,得到信息之后,再去执行其他的业务逻辑结合配置文件,动态的创建对象并调用方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级FPGA开发之基础协议PCIe

基础协议之PCIe部分 一、TLP包的包头 在PCIe的系统中&#xff0c;tlp包的包头的结构有许多部分是相似的&#xff0c;通过掌握这些常规的包头&#xff0c;能帮助理解在PCIe总线上各个设备之间如何进行数据的收发。 通用的字段 通用字段作用Fmt决定了包头是3DW还是3DW&#xff…

2V2无人机红蓝对抗仿真

两架红方和蓝方无人机分别从不同位置起飞&#xff0c;蓝方无人机跟踪及击毁红方无人机 2020a可正常运行 2V2无人机红蓝对抗仿真资源-CSDN文库

Android电动汽车充电服务vue+uniAPP微信小程序

本系统利用SSM和Uniapp技术进行开发电动汽车充电服务系统是未来的趋势。该系统使用的编程语言是Java&#xff0c;数据库采用的是MySQL数据库&#xff0c;基本完成了系统设定的目标&#xff0c;建立起了一个较为完整的系统。建立的电动汽车充电服务系统用户使用浏览器就可以对其…

Python爬虫urllib详解

前言 学习爬虫&#xff0c;最初的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢&#xff1f;请求需要我们自己来构造吗&#xff1f;需要关心请求这个数据结构的实现吗&#xff1f;需要了解 HTTP、TCP、IP 层的网络传输通信吗&#xff1f;需要知…

华清远见嵌入式学习——春节作业——2.4日

作业要求&#xff1a; 编写程序实现二叉树的创建&#xff0c;三种遍历自己销毁 作业答案&#xff1a; 作业代码截图 作业代码效果图 作业代码 #include "myhead.h"// 定义二叉树节点结构体 struct Tree {int value; //编号(值)struct Tree* left; //左子树stru…

idea创建spring项目

一、环境 window10 IDEA 2022.2.3 maven-3.8.6 二、创建spring项目 1、新建Maven项目 File -> New -> Project 然后如下图选中Maven Archetype&#xff0c;在Archetype&#xff0c;选中maven-archetype-webapp&#xff0c;点击Create 2、配置maven 默认是使用IDEA内…

管理类联考-复试-英语-听力

文章目录 准备工作1.如何准备英语听力&#xff1f;2.听力学习注意事项一&#xff1a;培养良好的听音习惯&#xff0c;听读顺序要合理3.听力学习注意事项二&#xff1a;边听边记关键词 训练短期记忆能力4.听力学习注意事项三&#xff1a;熟记语篇衔接词把握信息走向5.听力学习注…

少儿编程 中国电子学会图形化编程2022年1月等级考试Scratch三级真题解析(选择题、判断题)

1.默认小猫角色和气球角色都是显示状态&#xff0c;小猫程序如下图所示&#xff0c;气球没有程序&#xff0c;点击绿旗&#xff0c;舞台上最终显示的效果是&#xff1f;&#xff08; &#xff09; A&#xff1a;可能出现6个不同位置的小猫和6个小球 B&#xff1a;可能出现6个…

Multisim14.0仿真(四十九)共阴极/阳极7段数码管驱动设计

一、74LS47/48简介: 74LS47/48芯片是一种常用的七段数码管译码器驱动器,常用在各种数字电路和单片机系统的显示系统中. 二、74LS47/48引脚说明及定义: 7段显示译码器74LS47/48是输出低/高电平有效的译码器,74LS47/48除了有实现7段显示译码器基本功能的输入(DCBA)和输出(Ya…

Unity类银河恶魔城学习记录1-9 PlayerWallSilde源代码 P36

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; us…

gerrit 安装插件

1.插件下载 gerrit 3.9 插件&#xff0c;打开链接去右上角搜索插件名称&#xff0c;找到合适的版本&#xff0c;由于我这儿需要安装gerrit 3.9.1 的 autosubmitter 插件&#xff0c;但是好像没有 3.9 的&#xff0c;有下面这俩 上面那个可以理解为基于插件的主分支代码进行构…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之MenuItemGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItemGroup组件 该组件用来展示菜单MenuItem的分组。 子组件 无 接…

高通android设备themal读取cpu温度

以msm8953的themal分布信息&#xff0c;主要是下图的位置&#xff1a; 这其中 cpu相关的themal的位置有&#xff1a; 读取thermal 温度数据可以通过以下几个步骤&#xff1a; 获取sensor_info rootmsm8953_64:/ # cat /sys/module/msm_thermal/sensor_info tsens:tsens_tz_se…

我用全志V851s做了一个魔法棒,使用Keras训练手势识别模型控制一切电子设备

这是一个可以直接启动原神的魔法棒~ 原神&#xff0c;启动&#xff01; 这是一个万全的解决方案&#xff01;只需要花80元再动动手&#xff0c;就可以将哈利波特的魔杖与人工智能结合到一起&#xff01;它就是用全志V851s做的赛博魔杖&#xff01; 这个魔法手杖有啥亮点 手势…

Go协程揭秘:轻量、并发与性能的完美结合

目录 1. Go协程简介什么是Go协程&#xff1f;Go协程与线程的比较Go协程的核心优势 2. Go协程的基本使用创建并启动Go协程使用匿名函数创建Go协程Go协程与主函数 3. Go协程的同步机制1. 通道 (Channels)2. sync.WaitGroup3. 互斥锁 (sync.Mutex) 4. Go协程的高级用法1. 选择器 (…

每日一题——LeetCode1394.找出数组中的幸运数

方法一 桶数组计数法 又要保存整数的数值和他出现的频次&#xff0c;那么碰到一个整数num就让res[num]&#xff0c;那么循环res数组&#xff0c;如果res[i]0则代表i没有在arr中出现过&#xff0c;res[i]n则代表i在arr中出现n次 因为题目要求只返回最大的幸运数&#xff0c;所…

计算机软件能力认证考试CCF-202312-1 仓库规划

#自己跑的测试没问题&#xff0c;不知道为啥就是不能满分 原理比较绕&#xff0c;就是让数组中一行不断地与其他行进行比较&#xff0c;最终得到各自的索引 #include <iostream> using namespace std; int main() {int n;int m;cin>>n>>m; int array[n][m];…

【C/C++ 08】简单计算器

一、题目 输入算术表达式&#xff0c;可包含空格&#xff0c;检查算术表达式的合法性&#xff0c;若算术表达式不合法&#xff0c;打印错误类型&#xff0c;若合法&#xff0c;则进行运算&#xff0c;打印计算结果。 二、算法 1. 将输入的算术表达式字符串去除空格。 2. 检查…

电源模块欠压保护点测试方法分享 纳米软件

电源欠压保护原理 欠压保护是指当电源电压低于一定值时&#xff0c;电源的保护功能会及时断开电路&#xff0c;避免设备受到损坏。电源欠压保护一般是通过一个或多个传感器来检测电压&#xff0c;当电压低于设定值时就会触发电源的保护功能&#xff0c;断开电路&#xff0c;保护…

猫用空气净化器真的能除菌吗?除毛可以用宠物空气净化器吗?

猫咪给我们带来了无尽的欢乐&#xff0c;但它们换毛时家里到处都是猫毛。我们会在地板、沙发上发现一大堆&#xff0c;甚至衣服也难逃其影响。这些浮毛中可能携带着微生物和尘螨等。对于免疫力较低的老年人、孩子和孕妇来说&#xff0c;他们更容易感染这些微生物。而对于鼻炎患…