java反射对象赋值_Java反射详解

反射(Reflection)能够让运行于 JVM 中的程序检测和修改运行时的行为。

Class类提供了以下方法

四个public方法,用于获取某个类的构造方法:

Constructor getConstructor(Class[] params)

// 根据构造函数的参数,返回一个具体的具有public属性的构造函数

Constructor getConstructors()

// 返回所有具有public属性的构造函数数组

Constructor getDeclaredConstructor(Class[] params)

// 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)

Constructor getDeclaredConstructors()

// 返回该类中所有的构造函数数组(不分public和非public属性)

四种获取成员方法的方法

Method getMethod(String name, Class[] params)

// 根据方法名和参数,返回一个具体的具有public属性的方法

Method[] getMethods()

// 返回所有具有public属性的方法数组

Method getDeclaredMethod(String name, Class[] params)

// 根据方法名和参数,返回一个具体的方法(不分public和非public属性)

Method[] getDeclaredMethods()

// 返回该类中的所有的方法数组(不分public和非public属性)

四种获取成员属性的方法

Field getField(String name)

// 根据变量名,返回一个具体的具有public属性的成员变量

Field[] getFields()

// 返回具有public属性的成员变量的数组

Field getDeclaredField(String name)

// 根据变量名,返回一个成员变量(不分public和非public属性)

Field[] getDelcaredFields()

// 返回所有成员变量组成的数组(不分public和非public属性)

getDeclaredFields 和 getFields 的区别:

getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

getFields()获得某个类的所有的公共(public)的字段,包括父类。

获取父类的方法

Class> superclass = class1.getSuperclass() ;

获取接口

Class>[] interS = class1.getInterfaces() ;

// 获取所有的接口

实例化

Object object = class1.newInstance() ;

//创建实例化:相当于 new 了一个对象

实例

Person.class

package reflection;

public class Person {

private String id;

private String name;

public String age;

public static String str = "Json";

//构造函数1

public Person() {

System.out.println( "构造函数 无参" );

}

//构造函数2

public Person(String id) {

this.id = id;

System.out.println( "构造函数 id : " + id );

}

//构造函数3

public Person(String id, String name) {

this.id = id;

this.name = name;

System.out.println( "构造函数 id : " + id + " name: " + name );

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

/**

* 静态方法

*/

public static String update(int id) {

return str+id;

}

}

练习一:通过反射,获取对象实例,并且操作对象的方法

package reflection;

public class T1 {

public static void main(String[] args) {

try {

//创建类

Class> class1 = Class.forName("reflection.Person");

//创建实例化:相当于 new 了一个对象

Object object = class1.newInstance();

//向下转型

Person person = (Person) object;

person.setId("100");

person.setName("jack");

System.out.println("id: " + person.getId() + " name: " + person.getName());

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

运行结果:

id: 100 name: jack

练习二:通过反射获取对象字段属性,并且赋值

package reflection;

import java.lang.reflect.Field;

public class T1 {

public static void main(String[] args) {

try {

//创建类

Class> class1 = Class.forName("reflection.Person");

//创建实例

Object person = class1.newInstance();

//获得id 属性

Field idField = class1.getDeclaredField( "id" ) ;

//打破封装 实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问

//由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的

idField.setAccessible( true );

//给id 属性赋值

idField.set(person, "100") ;

//打印 person 的属性值

System.out.println( idField.get( person ));

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

id 这个属性的是 private 私有的,不能修改它的值。需要添加 idField.setAccessible( true );

练习三:通过反射操作属性和方法

package reflection;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class T1 {

public static void main(String[] args) {

try {

//创建类

Class> class1 = Class.forName("reflection.Person");

//创建实例

Object person = class1.newInstance();

//获得id 属性

Field idField = class1.getDeclaredField( "id" ) ;

//打破封装 实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问

//由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的

idField.setAccessible( true );

//给id 属性赋值

idField.set( person , "100") ;

//获取 setName() 方法

Method setName = class1.getDeclaredMethod( "setName", String.class ) ;

//打破封装

setName.setAccessible( true );

//调用setName 方法。

setName.invoke( person , "jack" ) ;

//获取name 字段

Field nameField = class1.getDeclaredField( "name" ) ;

//打破封装

nameField.setAccessible( true );

//打印 person 的 id 属性值

String id_ = (String) idField.get( person ) ;

System.out.println( "id: " + id_ );

//打印 person 的 name 属性值

String name_ = ( String)nameField.get( person ) ;

System.out.println( "name: " + name_ );

//获取 getName 方法

Method getName = class1.getDeclaredMethod( "getName" ) ;

//打破封装

getName.setAccessible( true );

//执行getName方法,并且接收返回值

String name_2 = (String) getName.invoke( person ) ;

System.out.println( "name2: " + name_2 );

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

运行结果:

id: 100

name: jack

name2: jack

练习四:静态属性、静态方法调用

package reflection;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class T1 {

public static void main(String[] args) {

try {

//创建类

Class> class1 = Class.forName("reflection.Person");

//获取 nameField 属性

Field nameField = class1.getDeclaredField( "str" ) ;

//获取 nameField 的值

String name_ = (String) nameField.get( nameField ) ;

//输出值

System.out.println( name_ );

//有返回值,有参数

Method getUpdateMethod = class1.getDeclaredMethod( "update" , int.class ) ;

String result_4 = (String) getUpdateMethod.invoke( null , 1 ) ;

System.out.println( "返回值: "+ result_4 );

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

练习五:调用构造函数,创建对象实例

package reflection;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

public class T1 {

public static void main(String[] args) {

try {

//创建类

Class> class1 = Class.forName("reflection.Person");

//无参构造函数

Object object = class1.newInstance() ;

//有参构造函数:一个参数

Constructor> constructor = class1.getDeclaredConstructor( String.class ) ;

constructor.newInstance( "1000" ) ;

//有参构造函数:二个参数

Constructor> constructor2 = class1.getDeclaredConstructor( String.class , String.class ) ;

constructor2.newInstance( "1001" , "jack" ) ;

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace() ;

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

参考文章

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

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

相关文章

Oracle装置后果

来历:网海拾贝 本日未来诰日装置Oracle后,出现了两个后果。 经过过程SQL Plus不竭无法连接长途数据库,提醒错误ORA-12514:TNS:监听过程不能解析在连接描绘符中给出的SERVICE_NAME。 厥后缔造用可视化的Net Configuration Assistant东西对监听…

Java Hashtable hashCode()方法及示例

Hashtable类hashCode()方法 (Hashtable Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to return the hash code value for this object in this Hashtable. hashCode()方法…

C---蝉、蜻蜓、蜘蛛

【问题描述】 已知 腿/条翅膀/对蝉61蜻蜓62蜘蛛80 现有小虫n只,共有X条腿和Y对翅膀,问蝉、蜻蜓、蜘蛛各有多少只?请使用循环的知识解决,数据确保有解。 【输入形式】三个用空格隔开的整数,依次为n、X、Y 【输出形式】…

轮廓(查找和绘制轮廓、轮廓的表达与组织、轮廓的特性)

目录1、轮廓的定义2、如何在图像中找到轮廓opencv自带的查找轮廓函数:findContours()3、轮廓的表达方式1.顶点的序列2.Freeman链码4、轮廓之间的组织方式5、轮廓的特点(这部分可以展开来详细探讨,这里不做过多解释)6、轮廓的匹配7、绘制轮廓d…

python如何操作oracle数据库_python操作oracle数据库

搜索热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。# -*- mode: python; coding: utf-8 -*-## python operate oracle,contain insert、delete、update、select.## author liyulin# date 2014-11-07import…

可能用得上的jquery 插件

Chosen (github) 是一个强大的增强下拉选择框的插件,支持自定义css样式。同时你可以使用ajax增加一些回调函数,插件会给hidden input复制,这样你可以在提交表单的时候获得正确的值。 Turn.js 是一个 JavaScript 库,使您的网页内容…

草根创业回忆录二: 都选择的是什么人?

草根创业回忆录二: 都选择的是什么人? 前言:选合伙人和投资就像在选女朋友一样,要谨慎,甚至有时候宁缺毋滥。 曾经以为有了钱,就会找到需要的人,后来发现不是这样的。 也以为,随便拉几个关系好的…

float.equals_Java Float类equals()方法与示例

float.equals浮动类equals()方法 (Float class equals() method) equals() method is available in java.lang package. equals()方法在java.lang包中可用。 equals() method is used to check equality or inequality of this Object against the given Object or in other wo…

01-基本配置与测试

一、开发环境 使用的是Anaconda 3,其中Python版本为3.6.3 首先,在Anaconda下的Scripts文件夹下打开命令框 使用pip install -U selenium安装selenium 打开Jupiter Notebook,输入from selenium import webdriver进行测试 不报错即安装成功 …

Opencv——查找并绘制凸包、凸包与轮廓的关系

定义 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型。 理解物体形状或轮廓的一 种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)。 检测凸包 opencv自带函数:convexHull() 参数解释&a…

EF Code First 简单的示例

一对多&#xff1a; public class Category {public Category(){Id GuidComb.GenerateComb();}public Guid Id { get; set; }public string Name { get; set; }public string Description { get; set; }public virtual IList<Topic> Topics { get; set; } }public class…

线程同步 - 整理

线程同步机制为线程协同工作而设计&#xff0c;windows系统中有多种机制可以用于线程同步&#xff0c;最常用的有下面几种&#xff1a; 互斥对象(Mutex)时间对象(Event)信号量(Semaphore)临界区(critical section)可等待计时器(waitable Timer)同步过程中两个重要的概念是同步对…

智能车复工日记【N】:图像处理——环岛debug记录(持续更新)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 Debug记录 代码以及思路整理:系列文章4.10号更新5.4号更新5.5号更新代码以及思路整理: 【智能车Code review】——环岛的判…

java接口并发衡量_java 后端设计高并发接口总结

如何设置高并发接口一、并发队列的选择二、请求接口的合理设计三、高并发下的数据安全3.1 超发的原因3.2 悲观锁思路3.3 FIFO队列思路3.4 乐观锁思路一、并发队列的选择Java的并发包提供了三个常用的并发队列实现&#xff0c;分别是&#xff1a;ArrayBlockingQueue、Concurrent…

两倍---C++

【问题描述】给定n个不同的正整数&#xff0c;你的任务是计算这些数里面有多少个数对满足&#xff1a;数对中一个数是另一个数的两倍&#xff0c;比如给定1 4 3 2 9 7 18 22&#xff0c;得到的答案是3&#xff0c;因为2是1的两倍&#xff0c;4是2的两倍&#xff0c;18是9的两倍…

java bitset_Java BitSet cardinality()方法与示例

java bitsetBitSet类cardinality()方法 (BitSet Class cardinality() method) cardinality() method is available in java.util package. cardinality()方法在java.util包中可用。 cardinality() method is used to return the cardinality (i.e. the number of bits is set t…

LeetCode: Merge k Sorted Lists

自己写的太复杂了&#xff0c;一开始想的是给开始的lists头们排序&#xff0c;然后从这个序列的第一个抽出来&#xff0c;然后再重新用二分法进行排序&#xff0c;不过这个方法large超时了&#xff0c;看了网上的发现还是用很土地方法用一个for循环从前两个开始merge到最后&…

JAVA 取得当前目录的路径

在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上 1.可以在servlet的init方法里 String path getServletContext().getRealPath("/"); 这将获取web项目的全路径 例如 :E:/eclipseM9/workspace/tree/ tree是我web项目的根目录 2.你也可以随时在任意…

golang mysql curd_Go 语言操作 MySQL 之 CURD 操作

本文转载于SegmentFault社区作者&#xff1a;Meng小羽MySQL 是目前开发中最常见的关系型数据库&#xff0c;使用 Go 语言进行操控数据库需要使用 Go 自带database/sql和驱动go-sql-driver/mysql来实现。创建好 Go 项目&#xff0c;需要引用驱动依赖&#xff1a;go get -u githu…

02.1-元素定位(find)

常用的一些方法 一、导包 from selenium import webdriver二、打开火狐&#xff08;空白页&#xff09; b webdriver.Firefox()三、跳转到指定的网站 b.get(https://www.baidu.com/)四、将浏览器页面最大化 b.maximize_window()五、通过F12可查看当前的贴吧为超链接形式 …