Java学习笔记——反射

1、反射概述

Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大地增强程序的灵活性。

2、获取Class类的对象

我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象,这里我们提供了三种方法获取Class类型的对象:
①使用类的class属性来获取该类对应的Class对象。距离:Student.Class将会返回Student类对应的Class对象。
②调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用。
③使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径。

3、反射获取构造方法并使用

Class类中用于获取构造方法的方法:
//Constructor<?>[] getConstructors​()返回一个包含Constructor对象的数组,Constructor对象反映了由该Class对象表示的类的所有公共构造函数。
//Constructor<?>[] getDeclaredConstructors​()返回反映由该Class对象表示的类声明的所有构造函数的Constructor对象的数组。
//Constructor<T> getConstructor​(Class<?>...parameterTypes)返回一个Constructor对象,该对象反映由该Class对象表示的类的指定公共构造函数。
//Constructor<T> getDeclaredConstructor​(Class<?>...parameterTypes)返回一个Constructor对象,该对象反映由此Class对象表示的类或接口的指定构造函数。Constructor类中用于创建对象的方法
//TnewInstance​(Object...initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
基本数据类型也可以通过.class得到对应的Class类型//public void setAccessible​(boolean flag)将此反射对象的accessible标志设置为指示的布尔值。值为true表示反射对象应该在使用Java语言访问控制时抑制检查。值为false表示反射对象应该在使用Java语言访问控制时执行检查,并在类描述中指出变体。
//学生类
public class Student {//三个成员变量,一个私有,一个默认,一个公共private String name;int age;public String address;//四个构造方法,一私有,一默认,两公共public Student() {}private Student(String name) {this.name = name;}Student(int age) {this.age = age;}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}//成员方法:一个私有,四个公共private void function() {System.out.println("function");}public void method1() {System.out.println("method1");}public void method2(String s) {System.out.println("method2" + s);}public String method3(String s, int i) {return s + "," + i;}@Overridepublic String toString() {return "Student{name =" + name + ", age = " + age + ", adress = " + address + "}";}
}public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,InstantiationException, IllegalAccessException, InvocationTargetException {
//        Student s = new Student();//获取Class对象Class<?> c = Class.forName("myReflectDemo.Student");//基本数据类型也可以通过.class得到对应的Class类型Constructor<?> con = c.getConstructor(String.class, int.class, String.class);Object o = con.newInstance("张三丰", 30, "西安");System.out.println(o);System.out.println("----------");//暴力反射//public void setAccessible​(boolean flag)将此反射对象的accessible标志设置为指示的布尔值。// 值为true表示反射对象应该在使用Java语言访问控制时抑制检查。// 值为false表示反射对象应该在使用Java语言访问控制时执行检查,并在类描述中指出变体。Constructor<?> decon = c.getDeclaredConstructor(String.class);decon.setAccessible(true);Object o1 = decon.newInstance("张三丰");System.out.println(o1);}
运行结果:
Student{name =张三丰, age = 30, adress = 西安}
----------
Student{name =张三丰, age = 0, adress = null}

4、反射获取成员变量并使用

Class类中用于获取成员变量的方法:
//Field[] getFields​()返回一个包含Field对象的数组,Field对象反映由该Class对象表示的类或接口的所有可访问的公共字段。
//Field getField​(String name)返回一个Field对象,该对象反映由该Class对象表示的类或接口的指定公共成员字段。
//Field[] getDeclaredFields​()返回一个Field对象的数组,反映了由该Class对象表示的类或接口声明的所有字段。
//Field getDeclaredField​(String name)返回一个Field对象,该对象反映由该Class对象表示的类或接口的指定声明字段。//voidset​(Object obj,Object value)	给obj对象的成员变量赋值为value	将指定的对象参数中由此Field对象表示的字段设置为指定的新值。
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException,NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取Class对象Class<?> c = Class.forName("myReflectDemo.Student");//Student s = new Student();Constructor<?> con = c.getConstructor();Object obj = con.newInstance();System.out.println(obj);System.out.println("----------");Field name = c.getDeclaredField("name");//public void setAccessible​(boolean flag)将此反射对象的accessible标志设置为指示的布尔值。 值为true表示反射对象应该在使用Java语言访问控制时抑制检查。// 值为false表示反射对象应该在使用Java语言访问控制时执行检查,并在类描述中指出变体。name.setAccessible(true);name.set(obj, "张三丰");System.out.println(obj);System.out.println("----------");Field age = c.getDeclaredField("age");age.setAccessible(true);age.set(obj, 36);System.out.println(obj);System.out.println("----------");Field field = c.getField("address");field.set(obj, "西安");System.out.println(obj);}
运行结果:Student{name =null, age = 0, adress = null}----------Student{name =张三丰, age = 0, adress = null}----------Student{name =张三丰, age = 36, adress = null}----------Student{name =张三丰, age = 36, adress = 西安}

5、反射获取成员方法并使用

Class类中用于获取成员方法的方法
//Method[] getMethods​()返回一个包含方法对象的数组,方法对象反映由该Class对象表示的类或接口的所有公共方法,包括由类或接口声明的对象以及从超类和超级接口继承的类。
//Method[] getDeclaredMethods​()返回一个包含方法对象的数组,方法对象反映由Class对象表示的类或接口的所有声明方法,包括public,protected,default(package)访问和私有方法,但不包括继承方法。
//Method getMethod​(Stringname,Class<?>...parameterTypes)返回一个方法对象,该对象反映由该Class对象表示的类或接口的指定公共成员方法。
//Method getDeclaredMethod​(Stringname,Class<?>...parameterTypes)返回一个方法对象,它反映此表示的类或接口的指定声明的方法Class对象。Method类中用于调用成员方法的方法
//Objectinvoke​(Objectobj,Object...args)在具有指定参数的指定对象上调用此方法对象表示的基础方法。
 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取Class对象Class<?> c = Class.forName("myReflectDemo.Student");//Method[] getMethods​() 返回一个包含 方法对象的数组,方法对象反映由该 Class对象表示的类或接口的所有公共方法,// 包括由类或接口声明的对象以及从超类和超级接口继承的类。Method[] methods = c.getMethods();for (Method m : methods) {System.out.println(m);}System.out.println("-------------");//Method[] getDeclaredMethods​() 返回一个包含 方法对象的数组,方法对象反映由 Class对象表示的类或接口的所有声明方法,// 包括public,protected,default(package)访问和私有方法,但不包括继承方法。Method[] dm = c.getDeclaredMethods();for (Method m : dm) {System.out.println(m);}System.out.println("-------------");//Method getMethod​(String name, Class<?>... parameterTypes) 返回一个方法对象,// 该对象反映由该 Class对象表示的类或接口的指定公共成员方法。Method method1 = c.getMethod("method1");
//        System.out.println(method1);//获取无参构造方法创建对象Constructor<?> con = c.getConstructor();Object obj = con.newInstance();//Object invoke​(Object obj, Object... args) 在具有指定参数的指定对象上调用此方法对象表示的基础方法。//Object:返回值类型//obj:调用方法的对象//args:方法需要的参数method1.invoke(obj);}
运行结果:public java.lang.String myReflectDemo.Student.toString()public void myReflectDemo.Student.method1()public java.lang.String myReflectDemo.Student.method3(java.lang.String,int)public void myReflectDemo.Student.method2(java.lang.String)public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic 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 java.lang.String myReflectDemo.Student.toString()private void myReflectDemo.Student.function()public void myReflectDemo.Student.method1()public java.lang.String myReflectDemo.Student.method3(java.lang.String,int)public void myReflectDemo.Student.method2(java.lang.String)-------------method1

获取成员方法案例

// 有一个ArrayList<Integer>集合,如何在这个集合中添加字符串元素?
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//创建集合对象ArrayList<Integer> array = new ArrayList<Integer>();//获取Class对象Class<? extends ArrayList> c = array.getClass();//获取add方法Method add = c.getMethod("add", Object.class);add.invoke(array, "hello");add.invoke(array, "world");add.invoke(array, "java");System.out.println(array);}
运行结果:
[hello, world, java]

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

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

相关文章

Linux NULL定义

下面是/usr /include/linux下的stddef.h文件中的NULL定义&#xff1a;#undef NULL#if defined(__cplusplus)#define NULL 0#else#define NULL ((void *)0)#endif

Linux内核--网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开

本文分析基于Linux Kernel 3.2.1 原创作品&#xff0c;转载请标明http://blog.csdn.net/yming0221/article/details/7996528 更多请查看专栏http://blog.csdn.net/column/details/linux-kernel-net.html 作者&#xff1a;闫明 1、套接字的绑定 创建完套接字服务器端会在应用层使…

pc模式 华为mate30_号称“重构想象”的华为Mate30系列,到底有多颠覆?一睹为快...

9月19日迎来了华为全球发布会&#xff0c;和9月11日的苹果新品发布会时间挨得非常近&#xff0c;大家感受到了什么吗&#xff1f;华为Mate30系列于北京时间9月19日晚上8点在慕尼黑正式亮相了&#xff0c;以“重构想象”为主题&#xff0c;发布了4款新机&#xff1a;Mate30、Mat…

python数据分析师书籍_如何自学成为数据分析师

展开全部 第1本《谁说菜2113鸟不会数据5261分析入门篇》 很有趣的数据分析书&#xff01;基本看过就能明白4102&#xff0c;以小说的1653形式讲解&#xff0c;很有代入感。包含了数据分析的结构化思维、数据处理技巧、数据展现的技术&#xff0c;很能帮我们提升职场竞争能力。找…

uvc摄像头

样品 1e4e:0109 第一批次 1e4e:0102 第二批次样品 1871:0101 1908:2311 uvc列表 www.ideasonboard.org/uvc/ www.ideasonboard.org/uvc/faq/

Java学习笔记——模块化

1、模块化概述&#xff1a; 无论是运行一个大型的软件系统&#xff0c;还是运行一个小的程序&#xff0c;即使程序 只需要使用Java的部分核心功能&#xff0c;JVM也要加载整个JRE环境。为了 让Java实现轻量化&#xff0c;Java9正式的推出了模块化统。Java被拆分成N 多个模块&a…

SDO_GEOMETRY Object Type

一、定义 SDO_GEOMETRY是MDSYS Schema下用户自定义的对象类型&#xff0c;用户在创建自己的数据表时&#xff0c;可以使用这种类型作为字段类型。使用了这种类型字段的数据表必须包含另外一个字段或者多个字段组合作为此表的唯一主键。这种类型的数据表&#xff0c;通常叫做空间…

python应声虫程序_Python编程基础

第 1章 准备工作 1 任务1&#xff0e;1 认识Python 1 1&#xff0e;1&#xff0e;1 初识Python 1 1&#xff0e;1&#xff0e;2 了解Python发展历史 2 1&#xff0e;1&#xff0e;3 了解Python特性 2 任务1&#xff0e;2 搭建Python环境 2 1&#xff0e;2&#xff…

650c公路车推荐_盘点2020年各价位高性价比入门公路车

2020年&#xff0c;一场突如其来的疫情席卷全球&#xff0c;使更多人明白了身体健康的可贵&#xff0c;越来越多的人开始参与到公路车骑行这一运动中来。面对各种良莠不齐的品牌、复杂晦涩难懂的配置表&#xff0c;不少刚入门的“小白”都一头雾水&#xff1a;该如何挑选适合自…

A20 触摸屏配置

A20 源码里现在支持的触摸屏应该是三种&#xff0c;ft5x, gt82x, gslX680 源码分别是 ft5x_ts.c, gt82x.c gslX680.c。 在这三个文件头部都有触摸屏配置结构体的引用。 extern struct ctp_config_info config_info; 搜索源码可以看到用到了以下几处。 ctp_get_system_c…

Java进阶07 嵌套类

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; 到现在为止&#xff0c;我们都是在Java文件中直接定义类。这样的类出现在包(package)的级别上。Java允许类的嵌套定义。 这里将讲解如何在一个类…

MySQL笔记——DQL查询数据

DQL查询包括以下这些内容&#xff1a; • 基础查询 • 条件查询(WHERE) • 分组查询(GROUP BY) • 排序查询(ORDER BY) • 分页查询(LIMIT)(一)、基础查询 1、查询多个字段 SELECT 字段列表 FROM 表名; SELECT * FROM 表名; 当前表中数据如下&#xff1a; 2、去除重复记录 …

c++两个vector合并_数据结构——算法初步(4)——合并排序算法

&#xfeff;从之前的学习可以看到&#xff0c;对大型vectory要求的排序&#xff0c;选择排序算法显然不符合要求&#xff0c;因为运行时间与输入问题规模大小的平方成比例增加&#xff0c;对于以线性顺序处理向量的元素的大多数排序算法也是如此。 所以要采用不同的方法来开发…

asterisk 互联

如上图所示&#xff0c;两个sip客户端分别注册在A,B两个asterisk服务器下&#xff0c;让A和B通过各自的asterisk服务器来相互通信。 xlite A的账号为2001&#xff0c;xlite B的账号为5001 asterisk A的sip.conf如下配置&#xff1a; [general] contextunauthenticated allow…

dll文件懒加载_一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

请注明转载地址&#xff1a;http://www.cnblogs.com/arhat通过上一章的学习&#xff0c;我们建立了Student和Clazz之间的关联属性&#xff0c;并从Student(many)的一方查看了Clazz的信息&#xff0c;同时我们使用了懒加载技术和立即执行的方式来实现了对象的关联查询&#xff0…

python代码加密 混淆_Python程序的混淆和加密

混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. 如果你觉得有用, 可以购买离线版本. 同时需要注意的是, 这个混淆其实还是被很多人怀疑的, 因为即使混淆了, 也没有改变代码的结构. 所以, 必要的话, 在编程的时候, 可以故意做点提高逆向难度…

[活动通知]Nanjing GDG 2013年4月活动

致各位亲爱的 Google 技术爱好者 很高兴的通知各位朋友&#xff0c;Nanjing GDG 将在本周日 (04/21) 举办我们 Nanjing GDG 的 4月份活动&#xff0c;热烈欢迎大家报名参加。 主题&#xff1a;利用开放社区和代码库来构建 Android 应用 时间&#xff1a; 4月21 日 (周日) 下午 …

python linux运维教程 推荐_Linux运维人员成长之路学习书籍推荐

原标题&#xff1a;Linux运维人员成长之路学习书籍推荐一、入门书&#xff1a;《鸟哥的私房菜(基础篇)》《鸟哥的私房菜(服务篇)》《Linux命令行与Shell脚本编程大全(第2版)》《UNIX/Linux 系统管理技术手册》《UNIX编程艺术》二、计算机及操作系统原理书&#xff1a;《深入理解…

MySQL笔记——外键约束和表关系(一对一,多对一,多对多)

一、外键约束 概念&#xff1a;外键用来让两个表的数据之间建立链接&#xff0c;保证数据的一致性和完整性。语法&#xff1a;&#xff08;1&#xff09;添加约束-- 创建表是添加外键约束CREATE TABLE 表名(列名 数据类型,…[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REF…

asterisk 学习笔记1

一&#xff1a; Asterisk为特定的目标指定了一些extension名称。 i:Invalid s:Start h:Hangup t:Timeout T:AbsoluteTimeout o:Operator 一般常用的是i和t 二&#xff1a; asterisk拨号方案的调试可以用NoOp()函数&#xff0c;这个函数什么也不做&#xff0c;…