java反射的使用概览

额,研究过这个的人很多很多,但是我没有很深入的研究过,所以谁也拦不住我去研究研究,然后记录下来······如有雷同··那就雷同了···请多多包涵。

 

首先是整个项目的结构:

 

 

使用到的类:

 

package reflect.demo;public class Demo {}

 

package reflect.person;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
public @Data class Person {private String name;private int age;public Person(int age) {super();this.age = age;}public Person(String name) {super();this.name = name;}}

 

 

 

 

 

 

package reflect.person1;public interface China {public static final String name = "xxxxx";public static int age = 12;public void sayChina();public void sayHello(String name, int age);
}

 

 

 

 

 

 

package reflect.person1;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person1 implements China {private String sex;@Overridepublic void sayChina() {System.out.println("hello,china");}@Overridepublic void sayHello(String name, int age) {System.out.println(name + "---" + age);}}

 

 

 

 

 

 

package reflect;import lombok.Getter;
import lombok.Setter;public class HelloOriginal {@Getter@Setterprivate static Class<?> demo;static {try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

 

 

 

 

 

 

1.凡是程序,都以HELLOWORLD来开始,貌似谁也避免不了哩。

 

package reflect.test1;import reflect.demo.Demo;/*** @author Administrator 通过一个对象获得完整的包名和类名*/
public class Hello {public static void main(String[] args) {Demo demo = new Demo();System.out.println(demo.getClass().getName());}
}

 

 

 

这是反射的最最基础的东西了吧,我新建了一个对象,并且通过这个对象来获得它的class,有了class以后,我就可以操作class的相关信息了,这里我打印出了这个class的name属性。

这里就很容易的理解了反射,反射反射就是反过来搞。我们总是通过类来创建对象,而现在我们通过一个特定的对象(有时候我们不知道这个对象所属什么类)获得了它所归属的类的相关信息。

运行结果:

 

2.创建class对象的三种方式

 

package reflect.test2;import reflect.demo.Demo;/*** @author Administrator 实例化Class类对象**/
public class Hello {public static void main(String[] args) {Class<?> demo1 = null;// Class<?>是一种泛型的表达,意思是Object类及其子类都可以放Class<?> demo2 = null;Class<?> demo3 = null;try {// 一般使用的方式,通过指定特定的名称来创建classdemo1 = Class.forName("reflect.demo.Demo");} catch (Exception e) {e.printStackTrace();}demo2 = new Demo().getClass();//通过一个对象来获得classdemo3 = Demo.class;//通过类来获得classSystem.out.println("类名称   " + demo1.getName());System.out.println("类名称   " + demo2.getName());System.out.println("类名称   " + demo3.getName());}}


运行结果:

 

 

3.通过反射来创建(实例化)一个对象,使用的是无参构造方法。

 

package reflect.test3;import reflect.person.Person;/*** @author Administrator 通过Class实例化其他类的对象* *         通过无参构造实例化对象*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");//获得了特定名称的类的class对象} catch (ClassNotFoundException e) {e.printStackTrace();}Person person = null;try {person = (Person) demo.newInstance();//使用class对象的newInstance()方法就可以创建一个对象了。/*** * * */} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}person.setName("ri");person.setAge(1);System.out.println(person);}
}


4.通过有参的构造方法来构造对象

 

 

package reflect.test4;import java.lang.reflect.Constructor;import reflect.person.Person;/*** @author Administrator**         通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Person per1 = null;Person per2 = null;Person per3 = null;Person per4 = null;Constructor<?> cons[] = demo.getConstructors();try {per4 = (Person) cons[0].newInstance();per3 = (Person) cons[1].newInstance("ri", 12);per1 = (Person) cons[2].newInstance("dd");per2 = (Person) cons[3].newInstance(12);} catch (Exception e) {e.printStackTrace();}System.out.println(per1);System.out.println(per2);System.out.println(per3);System.out.println(per4);}
}

 

 

5.通过反射来获得一个类所实现的接口

 

package reflect.test5;/*** @author Administrator 返回一个类实现的接口*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {e.printStackTrace();}// 获得所有的接口Class<?> intes[] = demo.getInterfaces();for (int i = 0; i < intes.length; i++) {System.out.println("Person1实现的接口:" + intes[i].getName());}}
}


运行结果:

 


 

6.通过反射来获得指定类的父类

 

package reflect.test6;/*** @author Administrator 取得其他类中的父类*/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Class<?> superClass = demo.getSuperclass();System.out.println("继承的父类为" + superClass.getName());}
}


运行结果:

 

 

7.通过反射来获得指定类中的构造方法

 

package reflect.test7;import java.lang.reflect.Constructor;/*** @author Administrator获得其他类中的全部构造函数**/
public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Constructor<?> cons[] = demo.getConstructors();for (Constructor<?> con : cons) {System.out.println(con);}}
}


8.通过拼装的方式来获得构造方法(本质是获得构造方法的各种信息,我们也可以用在类的各种方法上)

 

 

package reflect.test8;import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator 拼装获得构造方法的全部内容*/
public class Hello extends HelloOriginal {public static void main(String[] args) {Constructor<?>[] cons = getDemo().getConstructors();for (Constructor<?> con : cons) {Class<?>[] pts = con.getParameterTypes();System.out.print("构造方法:  ");int mo = con.getModifiers();System.out.print(Modifier.toString(mo) + " ");System.out.print(con.getName());System.out.print("(");for (int i = 0; i < pts.length; i++) {System.out.print(pts[i].getName() + " arg" + i);if (i < pts.length - 1) {System.out.print(",");}}System.out.println("){}");}}
}

 

 

9.拼装类中的所有方法的签名

 

package reflect.test9;import java.lang.reflect.Method;
import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator拼接获得类中普通方法的所有内容(方法签名)**/
public class Hello9 extends HelloOriginal {public static void main(String[] args) {/*获得类中的所有方法*/Method[] methods = getDemo().getMethods();for (Method method : methods) {Class<?> returnType = method.getReturnType();/*获得方法的返回类型的class实例*/Class<?>[] pts = method.getParameterTypes();/*获得方法参数的class实例的数组*/int tem = method.getModifiers();/*获得方法的修饰符*/System.out.print(Modifier.toString(tem) + " ");System.out.print(returnType.getName() + " ");System.out.print(method.getName() + "(");for (int i = 0; i < pts.length; i++) {System.out.print(pts[i].getName() + "arg" + i);if (i < pts.length - 1) {System.out.print(",");}}Class<?>[] execs = method.getExceptionTypes();/*获得方法抛出的异常*/if (execs.length > 0) {System.out.print(") throws ");for (int j = 0; j < execs.length; j++) {System.out.print(execs[j].getName() + " ");if (j < execs.length - 1) {System.out.print(",");}}} else {System.out.print(")");}System.out.println("{}");}}
}


10.通过反射获得本类以及继承的属性

 

 

package reflect.test10;import java.lang.reflect.Field;
import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator取得其他类的全部属性吧**/
public class Hello extends HelloOriginal {public static void main(String[] args) {System.out.println("=================本类全部属性=====================");Field[] fields = getDemo().getDeclaredFields();for (int i = 0; i < fields.length; i++) {// 权限修饰符int mo = fields[i].getModifiers();String priv = Modifier.toString(mo);// 属性类型Class<?> type = fields[i].getType();System.out.println(priv + " " + type.getName() + " "+ fields[i].getName() + ";");}System.out.println("===============实现的接口或者父类的属性========================");Field[] fields1 = getDemo().getFields();for (Field filed : fields1) {// 权限修饰符int mo = filed.getModifiers();String priv = Modifier.toString(mo);// 属性类型Class<?> type = filed.getType();System.out.println(priv + " " + type.getName() + " "+ filed.getName() + ";");}}
}

 


11.通过反射来调用其他类中的方法

 

 

 

package reflect.test11;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 通过反射调用其他类中的方法*/
public class Hello extends HelloOriginal {public static void main(String[] args) {try {Method method = getDemo().getMethod("sayChina");method.invoke(getDemo().newInstance());method = getDemo().getMethod("sayHello", String.class, int.class);method.invoke(getDemo().newInstance(), "34324", 33);} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}


12.通过反射调用其他类的get和set方法

 

 

package reflect.test12;import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 调用其他类的set和get方法*/
public class Hello extends HelloOriginal {public static void main(String[] args) throws Exception {Object obj = getDemo().newInstance();setter(obj, "Sex", "男", String.class);getter(obj, "Sex");}public static void getter(Object obj, String att) throws Exception {Method method = obj.getClass().getMethod("get" + att);System.out.println(method.invoke(obj));}public static void setter(Object obj, String att, Object value,Class<?> type) throws Exception {Method method = obj.getClass().getMethod("set" + att, type);method.invoke(obj, value);}
}


13.通过反射操作其他类的属性

 

 

package reflect.test13;import java.lang.reflect.Field;import reflect.HelloOriginal;
import reflect.person1.Person1;/*** @author Administrator 通过反射操作属性*/
public class Hello extends HelloOriginal {public static void main(String[] args) throws Exception {Object obj = getDemo().newInstance();Field field = getDemo().getDeclaredField("sex");field.setAccessible(true);field.set(obj, "女");System.out.println(((Person1) obj).getSex());}
}

14.通过反射获取并修改数组的信息

 

 

package reflect.test14;import java.lang.reflect.Array;import reflect.HelloOriginal;/*** @author Administrator 通过反射获取并修改数组的信息*/
public class Hello extends HelloOriginal {public static void main(String[] args) {int[] tem = { 1, 2, 3, 4, 5 };Class<?> test = tem.getClass().getComponentType();System.out.println("数组类型" + test.getName());System.out.println("数组长度  " + Array.getLength(tem));System.out.println("数组的第一个元素: " + Array.get(tem, 0));Array.set(tem, 0, 100);System.out.println("修改之后数组第一个元素为: " + Array.get(tem, 0));}
}


15.通过反射修改数组的大小

 

 

package reflect.test15;import java.lang.reflect.Array;/*** @author Administrator 通过反射修改数组大小*/
public class Hello {public static void main(String[] args) {int[] temp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int[] newTmep = (int[]) arrayInc(temp, 15);print(newTmep);String[] atr = { "a", "b", "c" };String[] str1 = (String[]) arrayInc(atr, 8);print(str1);}public static Object arrayInc(Object obj, int len) {Class<?> tem = obj.getClass().getComponentType();Object newArr = Array.newInstance(tem, len);int co = Array.getLength(obj);System.arraycopy(obj, 0, newArr, 0, co);return newArr;}public static void print(Object obj) {Class<?> clazz = obj.getClass();if (!clazz.isArray()) {return;}System.out.println("数组长度为----" + Array.getLength(obj));for (int i = 0; i < Array.getLength(obj); i++) {System.out.println(Array.get(obj, i));}}
}


16.通过反射获得类加载器

 

 

package reflect.test16;import reflect.person.Person;/*** @author Administrator 获得类加载器*/
public class Hello {public static void main(String[] args) {Person person = new Person();System.out.println(person.getClass().getClassLoader().getClass());}
}

 

 

17.使用java的代理

 

package reflect.subject;public interface Subject {public String say(String name, int age);
}

 

package reflect.subject;public class RealSubject implements Subject {@Overridepublic String say(String name, int age) {return name + "  " + age;}}

 

 

 

package reflect.subject;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler {private Object obj = null;public Object bind(Object obj) {this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println(proxy.getClass());return method.invoke(this.obj, args);}}

 

 

 

package reflect.test17;import reflect.subject.MyInvocationHandler;
import reflect.subject.RealSubject;
import reflect.subject.Subject;/*** @author Administrator 动态代理测试*/
public class Hello {public static void main(String[] args) {MyInvocationHandler demo = new MyInvocationHandler();Subject sub = (Subject) demo.bind(new RealSubject());String info = sub.say("xxxxx", 20);System.out.println(info);}
}

 

 

 

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

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

相关文章

moodle3.7中文语言包

Moodle官方有中文语言包&#xff0c;但是还有没有翻译的&#xff0c;为了提高用户体验&#xff0c;可以将部分未翻译的应用在Moodle网站管理中自己修改。 具体步骤&#xff1a; 先确定需要修改的关键字&#xff0c;也就是网站中没有翻译成中文的文字在centos中定位到moodle网站…

Spring项目中使用webservice实现h5的websocket通信

一、在项目中建立一个webservice来做后台操作。 package org.calonlan.soulpower.websocket;import java.text.SimpleDateFormat; import java.util.Date;import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.we…

[连载型] Neutron 系列 (15): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的...

问题导读&#xff1a;1.Nova安全组是什么&#xff1f;2.Nova的是如何配置的?3.FWaas是什么&#xff1f;1. Nova 安全组1.1 配置 节点配置文件配置项说明controller/etc/nova/nova.confsecurity_group_api nova是的 nova secgroup* 命令使用的是 nova 安全组的 API/etc/neutro…

LeetCode题解

题目是这样的&#xff1a;一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。问总共有多少条不同的路径&a…

java获得指定的开始时间与结束时间之间的所有日期

import java.text.SimpleDateFormat; import java.util.Calendar;public class TimerTest {public static void main(String[] args) throws Exception {String beginDate "2016-07-16";//开始时间String endDate "2016-07-25";//结束时间SimpleDateForm…

linux中umask的使用

在linux创建文件、文件夹的时候会给它们赋予默认的权限&#xff0c;这个默认权限的赋予就是和umask相关的。总结如下&#xff1a; 1&#xff1a;x 执行 2&#xff1a;w 写入 4&#xff1a;r 读取 文件创建的时候的权限为 666与umask的每一位对应相减&#xff1b;如 umask 为…

spring boot 与redis 整合

创建项目时需要导入的包 在application.yml 配置文件中配置需要的 spring:datasource:url: jdbc:mysql://localhost:3306/数据库名?useSSLfalse&serverTimezoneAsia/Shanghaiusername: 用户名password: 密码jpa:show-sql: truehibernate:ddl-auto: none #redis 可以不配,默…

Http长连接的例子_亲测可用哦

一、什么事Http长连接&#xff1a;在网上有很多很多关于Http长连接的文章&#xff0c;但是我看了很多都看不懂。自己总结的所谓的http长连接就是在一请求一个页面后&#xff0c;在服务器端不断开http连接&#xff0c;而是通过response一直在定时的往页面客户端刷新数据。 二、s…

不同操作系统上DNS客户端操作区别汇总

结论&#xff1a;windows有DNS缓存&#xff0c;Linux默认无DNS缓存&#xff0c;只能依赖于安装其他软件。 一、不同操作系统的客户端的DNS缓存差别 1、windows 系统中dns 解析器会使用系统的dns缓存来提高dns域名解析效率。 例如&#xff1a; 查看当前的dns cache内容&#xff…

SLAM学习心得——建图

1.建图 我们所谓的地图&#xff0c;即所有路标点的集合。一旦我们确定了路标点的位置&#xff0c;那就可以说我们完成了建图。 地图的作用&#xff1a;&#xff08;1&#xff09;定位 &#xff1b;&#xff08;2&#xff09;导航&#xff1b; &#xff08;3&#xff09;避障&am…

spark2

特点 通用 批处理 迭代式计算 交互查询 流处理 组件 spark core:任务调度 内存管理 容错机制 内部定义了RDDs 提供了很多API &#xff0c;为其他组件提供底层的服务 spark sql&#xff1a;报表统计 streaming :从kafka接收数据做实时统计 mlib&#xff1a;mll 支持横向扩展&am…

spark 监控--WebUi、Metrics System(转载)

转载自&#xff1a;https://www.cnblogs.com/barrenlake/p/4364644.html Spark 监控相关的部分有WebUi 及 Metrics System; WebUi用于展示Spark 资源状态、Metrics System 整合的指标信息。 Ui相关流程 Spark集群启动之后&#xff0c;我们可以通过Web观察集群状态等信息&#x…

Hadoop64位版本安装后遇到的警告处理

在使用hadoop的过程中&#xff0c;会遇到一个警告&#xff0c;内容如下&#xff1a; WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 对于这个问题网上很多说法是由于系统位数和所下载…

ueditor跨域上传图片文件(基于jsp框架、tomcat)

额&#xff0c;好久没有用到ueditor了&#xff0c;因为现在的相关工作很少涉及到富文本编辑&#xff1b;最近临时带了一个项目&#xff0c;里面要用到富文本编辑器&#xff0c;而且文件要统一上传到文件服务器上保存&#xff1b;应为以前用过ueditor就试着在网上着一些跨域保存…

精选Pycharm里6大神器插件

http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐&#xff0c;有小伙伴提议再来一篇Pycharm的主题。相比Sublime&#xff0c;Pycharm要强大许多&#xff0c;而且是专为python设计的集成开发环境&#xff0c;所以无论是自身功能、环境配置还是使用…

数字信号处理实验(一)——DTFT

一、离散序列傅里叶变化——DTFT 1、DTFT公式 2、Matlab算法实现 function[X]dtft(x,n,w,flag)%计算离散时间付里叶变换 %[X]dtft(x,n,w) %X在w频率点上的DTFT数组 %xn点有限长度序列 %n样本位置向量 %w频率点位置向量X x * (exp(-j).^(n * w));3、DTFT一些画图代码 function …

修改hadoop中yarn的webui中显示的任务时间为中国时间

在${HADOOP_HOME}\share\hadoop\yarn目录下找到hadoop-yarn-common-x.x.x.jar&#xff0c;然后用winRAR打开&#xff1b; 打开以后结构如下&#xff1a; 进入webapps/static/目录&#xff0c;然后修改yarn.dt.plugins.js&#xff1b;做出如下修改&#xff1a; &#xff08;1&a…

Trident API 概览

Trident API 概览 在网上看到了很多有TRIDENT相关API的翻译&#xff0c;看来看去&#xff0c;总觉得没有说清楚很多东西&#xff0c;所以自己结合使用的经验翻译了一篇出来&#xff1b;翻译完以后&#xff0c;也发现 在自己的翻译中也有很多地方是表达不清楚的不过多少感觉有些…

Trident State译文

Trident State 译文 Trident针对状态化的数据源的读写进行了一流的分装。State可以包含在拓扑中-例如&#xff0c;保存在内存中&#xff0c;有HDFS提供备份-也可以保存在一个外部的数据库中&#xff0c;像Memcached和Cassandra。针对以上的所有情况&#xff0c;Trident的API都…

软件之道:软件开发争议问题剖析

软件之道&#xff1a;软件开发争议问题剖析 基本信息 原书名&#xff1a; Making Software 原出版社&#xff1a; OReilly 作者&#xff1a; (美)Andy Oram Greg Wilson 译者&#xff1a; 鲍央舟 张玳 沈欢星丛书名&#xff1a; 图灵程序设计丛书出版社&#xff1a;人民邮…