javase复习day35反射

反射

获取class对象的方法 

public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {//获取反射的三种方式//第一种 Class.forName(全类名)//用法:最为常用Class<?> clazz1 = Class.forName("Reflection.Student");
//        System.out.println(clazz1);// class Reflection.Student//第二种//一般是当做 参数进行传递Class<Student> clazz2 = Student.class;System.out.println(clazz2==clazz1);//true//第三种//在有这个对象时使用Student s = new Student();Class<? extends Student> clazz3 = s.getClass();System.out.println(clazz3==clazz2);//true}
}

通过class获取构造方法,成员方法,成员变量

利用反射获取构造方法

public class Demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//获取class对象Class<?> clazz = Class.forName("Reflection.Demo2.Student");//通过class对象获取构造方法对象//获取非私用的构造方法集合
//        Constructor<?>[] cons1 = clazz.getConstructors();
//        /**
//         * public Reflection.Demo2.Student()
//         * public Reflection.Demo2.Student(java.lang.String)
//         */
//        for (Constructor<?> constructor : cons1) {
//            System.out.println(constructor);
//        }//获取全部构造方法集合(包括私有构造)
//        Constructor<?>[] cons2 = clazz.getDeclaredConstructors();
//        /**
//         * public Reflection.Demo2.Student()
//         * public Reflection.Demo2.Student(java.lang.String)
//         * protected Reflection.Demo2.Student(int)
//         * private Reflection.Demo2.Student(java.lang.String,int)
//         */
//        for (Constructor<?> constructor : cons2) {
//            System.out.println(constructor);
//        }//        //获取单个非私有构造方法(通过形参确定哪个构造方法)
//        Constructor<?> con3 = clazz.getConstructor(String.class);
//        //public Reflection.Demo2.Student(java.lang.String)
//        System.out.println(con3);//        //使用公开权限获取非公开会报错
//        Constructor<?> con4 = clazz.getConstructor(int.class);
//        /**
//         * Exception in thread "main" java.lang.NoSuchMethodException: Reflection.Demo2.Student.<init>(int)
//         * 	at java.base/java.lang.Class.getConstructor0(Class.java:3585)
//         * 	at java.base/java.lang.Class.getConstructor(Class.java:2271)
//         * 	at Reflection.Demo2.Demo.main(Demo.java:35)
//         */
//        System.out.println(con4);//        Constructor<?> con5 = clazz.getDeclaredConstructor(int.class);
//        //protected Reflection.Demo2.Student(int)
//        System.out.println(con5);Constructor<?> con6 = clazz.getDeclaredConstructor(String.class,int.class);//private Reflection.Demo2.Student(java.lang.String,int)
//        System.out.println(con6);//        //通过构造方法获取修饰符,修饰符使用Int类型的数据进行指代,私有使用2表述
//        int modifiers = con6.getModifiers();
//        System.out.println(modifiers);// 2//        //通过构造方法获取形参
//        //获取这个构造方法所有的参数
//        Parameter[] parameters = con6.getParameters();
//        //java.lang.String arg0
//        //int arg1
//        for (Parameter parameter : parameters) {
//            System.out.println(parameter);
//        }//        //获取这个构造方法所有参数的个数
//        System.out.println(con6.getParameterCount());//2//        //获取这个构造方法所有参数的类型
//        Class<?>[] parameterTypes = con6.getParameterTypes();
//        /**
//         * class java.lang.String
//         * int
//         */
//        for (Class<?> parameterType : parameterTypes) {
//            System.out.println(parameterType);
//        }//        //通过构造方法获取名字
//        System.out.println(con6.getName());//Reflection.Demo2.Student//通过构造方法获取对象//表述临时取消权限校验con6.setAccessible(true);//由于获取的构造方法为私有所以无法创建对象,但是使用上面的临时取消权限校验,可以使这个构造方法创建对象//这种方法叫暴力反射Student s = (Student) con6.newInstance("zhangsan", 18);System.out.println(s.toString());// Student{name = zhangsan, age = 18}}
}
public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name = name;}protected Student( int age) {this.name = name;this.age = age;}private Student(String name, int age) {this.name = name;this.age = age;}

利用反射获取成员变量

public class Demo3 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {//获取class对象Class<?> clazz = Class.forName("Reflection.Demo3.Student");//        Field[] fields = clazz.getFields();
//        //由于不是获取全部只获取到了公开的
//        //public java.lang.String Reflection.Demo3.Student.gender
//        for (Field f : fields) {
//            System.out.println(f);
//        }//获取全部成员变量
//        Field[] fields2 = clazz.getDeclaredFields();
//        //private java.lang.String Reflection.Demo3.Student.name
//        //private int Reflection.Demo3.Student.age
//        //public java.lang.String Reflection.Demo3.Student.gender
//        for (Field f : fields2) {
//            System.out.println(f);
//        }、//获取单个成员变量//public java.lang.String Reflection.Demo3.Student.genderField gender = clazz.getDeclaredField("gender");System.out.println(gender);//通过对象获取该成员方法的值Student s = new Student("lisi",18,"男");String gender1 = (String) gender.get(s);System.out.println(gender1);//男//修改改成员变量的值gender.set(s,"女");System.out.println(s);//Student{name = lisi, age = 18, gender = 女}}
}
public class Student {private String name;private int age;private String aaa(String name) throws IOException,NullPointerException, EOFException {System.out.println("aaa"+name);return "请问请问";}public void bbb(String name,int age){System.out.println("bbb"+name+age);}public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}

public class Student {private String name;private int age;public String gender;public Student() {}public Student(String name, int age, String gender) {this.name = name;this.age = age;this.gender = gender;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}/*** 获取* @return gender*/public String getGender() {return gender;}/*** 设置* @param gender*/public void setGender(String gender) {this.gender = gender;}public String toString() {return "Student{name = " + name + ", age = " + age + ", gender = " + gender + "}";}
}

利用反射获取成员方法

public class Demo4 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//获取class对象Class<?> clazz = Class.forName("Reflection.Demo4.Student");//获取所有公共的方法(包括父类中的公共方法)
//        Method[] methods = clazz.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }、//获取所有方法包括私有的方法(不包括父类中的方法
//        Method[] methods = clazz.getDeclaredMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }/*** public void Reflection.Demo4.Student.setAge(int)* public void Reflection.Demo4.Student.bbb(java.lang.String,int)* private void Reflection.Demo4.Student.aaa(java.lang.String)* public int Reflection.Demo4.Student.getAge()* public java.lang.String Reflection.Demo4.Student.getName()* public java.lang.String Reflection.Demo4.Student.toString()* public void Reflection.Demo4.Student.setName(java.lang.String)*///通过方法名和形参类型获取单个方法(有方法重载不能只靠方法名获取)Method m = clazz.getDeclaredMethod("aaa", String.class);//private void Reflection.Demo4.Student.aaa(java.lang.String)System.out.println(m);//获取各种数据//获取修饰符System.out.println(m.getModifiers());//2//获取方法的名字System.out.println(m.getName());//aaa//获取方法的形参Parameter[] parameters = m.getParameters();//java.lang.String arg0for (Parameter parameter : parameters) {System.out.println(parameter);}//获取方法的异常/*** class java.io.IOException* class java.lang.NullPointerException* class java.io.EOFException*/Class<?>[] exceptionTypes = m.getExceptionTypes();for (Class<?> exceptionType : exceptionTypes) {System.out.println(exceptionType);}//方法运行/*** Method 类中用于创建对象的方法* Object invoke(Object obj,Object...args):运行方法* 参数一:用Obj对象调用该方法* 参数二:调用方法传递的参数(如果没有就不写)* 返回值:方法的返回值(如果没有就不写)*/Student s = new Student();//暴露反射m.setAccessible(true);String str = (String) m.invoke(s, "汉堡包");//aaa汉堡包System.out.println(str);//请问请问}
}
public class Student {private String name;private int age;private String aaa(String name) throws IOException,NullPointerException, EOFException {System.out.println("aaa"+name);return "请问请问";}public void bbb(String name,int age){System.out.println("bbb"+name+age);}public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}

练习

练习一

public class Test {public static void main(String[] args) throws IOException, IllegalAccessException {Student s = new Student("小A",23,'女',167.5,"睡觉");Teacher t = new Teacher("波妞",10000);setdata(s);
//        setdata(t);}public static void setdata(Object obj) throws IOException, IllegalAccessException {//获取输出流FileOutputStream fos = new FileOutputStream("javaseday35\\src\\main\\java\\Reflection\\Test\\Test1\\a.txt");OutputStreamWriter osw = new OutputStreamWriter(fos);BufferedWriter bw = new BufferedWriter(osw);//获取输入对象的类对象Class<?> clazz = obj.getClass();//获取成员对象Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {
//            //处理成员对象,将成员对象转化为String类型
//            String string = field.toString();
//            //将对象的名字使用split方法进行切割,使用转义字符按照 . 进行切割
//            String[] split = string.split("\\.");
//            //将最后赋值给key
//            String key = split[split.length - 1];String key = field.getName();
//            System.out.println(string1);//处理每个成员对象//授权访问私有对象field.setAccessible(true);//获取到对用的值Object o = field.get(obj);String value = o.toString();//将key和value 存入文件bw.write(key+"="+value);bw.newLine();bw.flush();}bw.close();}
}
public class Student {private String name;private int age;private char gender;private double height;private String hobby;
public class Teacher {private String name;private double salary;
name=波妞
salary=10000.0l

练习二

public class Test {public static void main(String[] args) throws IOException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException {//获取配置文件的信息Properties pro = new Properties();FileInputStream fis = new FileInputStream("javaseday35\\src\\main\\java\\Reflection\\Test\\Test2\\pro.properties");//读取配置文件的信息pro.load(fis);fis.close();System.out.println(pro);//获取全类名和方法名String classmane = (String) pro.get("classmane");String mothed = (String) pro.get("mothed");System.out.println(classmane);System.out.println(mothed);//通过反射获取信息Class<?> clazz = Class.forName(classmane);//获取空参构造Constructor<?> constructor = clazz.getDeclaredConstructor();//通过空参构造获取空参对象Object o = constructor.newInstance();//通过方法名获取方法Method method = clazz.getDeclaredMethod(mothed);//调用方法method.invoke(o);}}
pro.propertiesclassmane=Reflection.Test.Test2.Student
mothed=eat
public class Student {private String name;private int age;private char gender;private double height;private String hobby;public void eat(){System.out.println("正在吃饭");}
public class Teacher {private String name;private double salary;public void eat(){System.out.println("正在吃饭");}

总结

动态代理

public class BigStar implements Star{private String name;public String sing(String name){System.out.println(this.name+"正在唱"+name);return "谢谢";}public void drice(){System.out.println(name+"正在跳舞");}public BigStar() {}public BigStar(String name) {this.name = name;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";}
}
public interface Star {public abstract String sing(String name);public abstract void drice();
}

小结

创建代理

/*
*
* 类的作用:
*       创建一个代理
*
* */
public class ProxyUtil {/*** 方法的作用:*       给一个明星的对象,创建一个代理**  形参:*       被代理的明星对象**  返回值:*       给明星创建的代理**** 需求:*   外面的人想要大明星唱一首歌*   1. 获取代理的对象*      代理对象 = ProxyUtil.createProxy(大明星的对象);*   2. 再调用代理的唱歌方法*      代理对象.唱歌的方法("只因你太美");* */public static Star createProxy(BigStar bigStar){/* java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)参数一:用于指定用哪个类加载器,去加载生成的代理类参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法参数三:用来指定生成的代理对象要干什么事情*/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 {/** 参数一:代理的对象* 参数二:要运行的方法 sing* 参数三:调用sing方法时,传递的实参* */if("sing".equals(method.getName())){System.out.println("准备话筒,收钱");}else if("dance".equals(method.getName())){System.out.println("准备场地,收钱");}//去找大明星开始唱歌或者跳舞//代码的表现形式:调用大明星里面唱歌或者跳舞的方法return method.invoke(bigStar,args);}});return star;}
}
public class Test {public static void main(String[] args) {/*需求:外面的人想要大明星唱一首歌1. 获取代理的对象代理对象 = ProxyUtil.createProxy(大明星的对象);2. 再调用代理的唱歌方法代理对象.唱歌的方法("只因你太美");*///1. 获取代理的对象BigStar bigStar = new BigStar("鸡哥");Star proxy = ProxyUtil.createProxy(bigStar);//2. 调用唱歌的方法String result = proxy.sing("只因你太美");System.out.println(result);}
}
public class BigStar implements Star {private String name;public BigStar() {}public BigStar(String name) {this.name = name;}//唱歌@Overridepublic String sing(String name){System.out.println(this.name + "正在唱" + name);return "谢谢";}//跳舞@Overridepublic void dance(){System.out.println(this.name + "正在跳舞");}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";}
}
public interface Star {//我们可以把所有想要被代理的方法定义在接口当中//唱歌public abstract String sing(String name);//跳舞public abstract void dance();}

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

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

相关文章

程序员如何以最快的方式提升自己?分享4个有效方法!

作家周国平说&#xff1a;人与人之间最重要的区别&#xff0c;不在物质的贫富和社会方面的境遇&#xff0c;是内在的素质和层次&#xff0c;把人分出了伟大与渺小、优秀与平庸。有的人醉心于三五成群的消遣&#xff0c;有的人专注于一步一脚印的努力&#xff0c;人和人之间的差…

Shiro-550—漏洞分析(CVE-2016-4437)

文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了&#xff0c;并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie&#xff0c;然后让后台最…

利用Puppeteer-Har记录与分析网页抓取中的性能数据

引言 在现代网页抓取中&#xff0c;性能数据的记录与分析是优化抓取效率和质量的重要环节。本文将介绍如何利用Puppeteer-Har工具记录与分析网页抓取中的性能数据&#xff0c;并通过实例展示如何实现这一过程。 Puppeteer-Har简介 Puppeteer是一个Node.js库&#xff0c;提供…

VUE.js笔记

1.介绍vue Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 Vue 应用程序的基本…

初识C语言(三)

感兴趣的朋友们可以留个关注&#xff0c;我们共同交流&#xff0c;相互促进学习。 文章目录 前言 八、函数 九、数组 &#xff08;1&#xff09;数组的定义 &#xff08;2&#xff09;数组的下标和使用 十、操作符 &#xff08;1&#xff09;算数操作符 &#xff08;2&#xff…

统计本周的订单数,统计最近7天的订单数

3个函数 DATE_SUB和SUBDATE在MySQL中的作用是一样的&#xff0c;它们都是用于执行日期的减法运算。具体来说&#xff0c;这两个函数都允许你从给定的日期或日期时间值中减去一个指定的时间间隔&#xff0c;然后返回一个新的日期或日期时间值。 DATE函数 DATE(time) 用于获取…

多机部署,负载均衡-LoadBalance

文章目录 多机部署,负载均衡-LoadBalance1. 开启多个服务2. 什么是负载均衡负载均衡的实现客户端负载均衡 3. Spring Cloud LoadBalance快速上手使用Spring Cloud LoadBalance实现负载均衡修改IP,端口号为服务名称启动多个服务 负载均衡策略自定义负载均衡策略 LoadBalance原理…

图像处理04

图像处理 问题&#xff1a;把不规则的图片按照参考图摆放 步骤&#xff1a; 1. 用ORB找关键点 2. 关键点匹配 3. 根据上一步匹配的关键点得出单应性矩阵 4. 根据单应性矩阵对不规则进行透视变换 import cv2 import numpy as np import matplotlib.pyplot as pltimgl cv2.imrea…

liunxcentos7下 跟目录空间不足docker load镜像报错空间不足

前两天在公司&#xff0c;做jenkins流水线项目&#xff0c;然后把项目放到docker容器里面运行&#xff0c;就在我把镜像打好包的时候正准备往服务器里面导入镜像的时候报错&#xff1a;如图所示 这时发现自己的根目录空间不足。 解决办法&#xff1a;重新加一块磁盘将磁盘挂载…

Java线程池和原子性

文章目录 前言1 线程池1.1 线程池概述1.1.1 线程池存在的意义1.1.2 Executors默认线程池 1.2 线程状态介绍1.2.1 线程状态源码1.2.2 线程状态含义1.2.3 线程状态转换图 2 原子性2.1 volatile关键字2.2 synchronized解决2.3 原子性2.4 AtomicInteger类2.5 悲观锁和乐观锁 前言 …

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识&#xff0c;了解了它的基本使用方法及注意事项&#xff0c;本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章&#xff1a; 详解 Vue 中 Watch 的使用方法及注意事项https://bl…

【Docker】02-数据卷

1. 数据卷 数据卷(volume) 是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 2. 常见命令 docker volume createdocker volume lsdocker volume rmdocker volume inspect 查看某个数据卷的详情docker volume prune 清除数据卷 **数据卷挂载&#xff1a…

bench.sh:一行命令测试Linux服务器基准测试

简介 bench.sh 是一个 Linux 系统性能基准测试工具。它的测试结果如下图&#xff1a;给出服务器的整体配置信息&#xff0c;IO 性能&#xff0c;网络性能。很多人使用它测试 vps 性能。 ​​ 一键运行 服务器在国外可以使用以下命令运行测试 wget -qO- bench.sh | bash复制…

微信小程序配置prettier+eslint

虽然微信开发者工具是基于vscode魔改的.但是由于版本过低,导致很多插件也用不上新版本.所以在微信开发者工具限制的版本下使用的prettier,eslint也是有版本要求. 本文主要就是记录一下需要的版本号 1.微信开发者工具安装插件 2.package.json中添加以下依赖及安装依赖 "de…

JVM(HotSpot):方法区(Method Area)

文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后&#xff0c;方法区是JVM内存的一个逻辑结构&#xff0c;真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 …

云服务器连接不上是什么原因引起的?

云服务器连接不上是什么原因引起的&#xff1f;云服务器连接不上是一个常见的问题&#xff0c;常见的原因有网络连接、账户权限、安全组设置、服务器状态、端口占用、远程登录未开启、云服务器已关闭或到期、防护软件限制、DNS劫持、资源负载过高。以下是一些主要原因及解决方法…

微信小程序 - 最新详细安装使用 Vant weapp UI 框架环境搭建详细教程

前言 自从 2024 年开始,小程序做了很多改变和升级, 导致网上很多搭建教程文章的教程失效了,本文来做最新的教程。 第一步 为了更贴合新手,我这里创建了一个纯净无任何业务代码的小程序项目。

SpringBoot-全局处理异常,时间格式,跨域,拦截器,监听器

1.全局异常处理 使用ControllerAdvice与ExceptionHandler注解 /*** 全局异常处理程序** author * date */ ControllerAdvice ResponseBody public class GlobalExceptionHandler {ExceptionHandler(Exception.class)public JsonResult handleException(Exception e) {e.print…

Wireshark学习使用记录

wireshark 是一个非常好用的抓包工具&#xff0c;使用 wireshark 工具抓包分析&#xff0c;是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境&#xff0c;另外一种就是应用比较多的互联网环境&#xff0c;也就是连接…

Windows下安装Neo4j流程

Neo4j简介 Neo4j 是一个基于图形结构的 NoSQL 数据库&#xff0c;专门用于存储和管理图数据。与传统的关系型数据库不同&#xff0c;Neo4j 使用 图&#xff08;graph&#xff09;的形式来表示数据&#xff0c;其中数据点&#xff08;称为 节点&#xff09;通过 边&#xff08;…