反射的操作方法
发布日期:2021-07-26 18:44:04 浏览次数:13 分类:技术文章

本文共 2930 字,大约阅读时间需要 9 分钟。

目标:通过反射获得User类的Class对象,得到该类的所有信息,构造User类的对象,调用普通方法,操作属性。

 *创建User类(方便演示)

package Reflect;public class User {	public int id;	protected int age;	private String uname;	public User(){			}	public User(int id, int age, String uname) {		super();		this.id = id;		this.age = age;		this.uname = uname;	}	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public int getAge() {		return age;	}	public void setAge(int age) {		this.age = age;	}	public String getUname() {		return uname;	}	public void setUname(String uname) {		this.uname = uname;	}}

(一) 获得该类的所有信息演示:

System.out.println("========================获得Class对象===================================");Class class1=Class.forName("Reflect.User");
System.out.println("========================获得类的名字===================================");System.out.println(class1.getName());//获得包名+类名System.out.println(class1.getSimpleName());//获得类名
System.out.println("========================获得可访问属性===================================");//获得public修饰的属性Field[] field1=class1.getFields();for(Field fs:field1){	System.out.println(fs);}System.out.println("==========");//获得所有的属性Field[] field2=class1.getDeclaredFields();for(Field fs:field2){	System.out.println(fs);}System.out.println("==========");//获得单独属性(name的属性)Field field3=class1.getDeclaredField("name");System.out.println(field3);
System.out.println("========================获得的类方法===================================");//获取类的所有方法Method[] methods=class1.getDeclaredMethods();for(Method m:methods){	System.out.println(m);}//获取类的单独方法Method m01=class1.getDeclaredMethod("getUname", null);//用于区分重载方法System.out.println(m01);Method m02=class1.getDeclaredMethod("setUname", String.class);//用于区分重载方法System.out.println(m02);

(二)构造User类对象

1)无参构造

方法一:Class c=Class.forName("Reflect.User");User u1=(User) c.newInstance();
方法二Class
c=(Class
)Class.forName("Reflect.User");User u1=c.newInstance();

2)有参构造

Constructor
c=clazz.getDeclaredConstructor(int.class,int.class,String.class);//获得有参构造器方法User u2=c.newInstance(1,18,"wang2");System.out.println(u2.getUname());//wang2

(三)调用普通方法

//方法一User u3=clazz.newInstance();u3.setUname("wang3");
//方法二(建议使用)User u3=clazz.newInstance();Method method=clazz.getDeclaredMethod("setUname",String.class);//获得了setUname(string){}方法method.invoke(u3, "wang33"); //invoke表示激活System.out.println(u3.getUname());

两方法比较:方法二更常用,因为获得的方法可以是从其他(数据库、游览器、文件)调过来的变量,体现反射的动态性,灵活度更高。

 

(四)操作属性

1)获得普通属性(注:用此方法获得私有属性会报错)

User u4=clazz.newInstance();Field f=clazz.getDeclaredField("id");//获得了id属性f.set(u4, 4);System.out.println(u4.getId()); //4

2)获得private...等属性

User u4=clazz.newInstance();Field f=clazz.getDeclaredField("uname");//获得uname属性f.setAccessible(true);//这个属性不需要做安全检查,可以直接访问f.set(u4, "wang4");System.out.println(u4.getUname()); //System.out.println(f1.get(u4));

说明:setAccessible-启用和禁用访问安全检查的开关,true为关闭,false(默认)为开启。

注意:setAccessible检查需要耗时间,影响效率,有时候可以关闭以此来提高反射效率。

(五)操作泛型、操作注解(未完待续)

转载地址:https://blog.csdn.net/qq_41877184/article/details/94070124 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JAVA基础:Super()详解
下一篇:反射中类的加载与Class对象的联系

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月13日 10时12分10秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

如何打开git命令窗口_win10系统如何将右键菜单中“在此处打开powershell窗口”调整为“在此处打开命令窗口”?... 2019-04-21
rtsp 华为_华为多实例生成树RSTP配置详解 2019-04-21
ewb交通灯报告和文件_基于ewb平台的交通灯电路设计.doc 2019-04-21
mysql中$使用_在MySQL中使用序列的简单教程 2019-04-21
mysql alter auto increment_将MySQL列更改为AUTO_INCREMENT 2019-04-21
mysql+err+1067_MySQL 5.7 Invalid default value for 'CREATE_TIME'报错的解决方法 2019-04-21
程序中mysql添加用户_MySQL添加用户的两种方法 2019-04-21
简述mysql安装过程_mysql安装的过程 2019-04-21
后端接口重定向_不用再等后端的接口啦!这个开源项目花 2 分钟就能模拟出后端接口... 2019-04-21
学mysql需要英语水平多高_大学英语专业挂科率高吗 2019-04-21
mysql group by实现_SQL数据分析之 group by 的实现原理 2019-04-21
mysql数据库大小如何查看器_如何用SQL命令查看Mysql数据库大小 2019-04-21
python 红黑树_红黑树-Python实现 | 学步园 2019-04-21
java string 日期格式_JAVA中String.format的用法 格式化字符串,格式化数字,日期时间格式化,... 2019-04-21
php显示json,使用 PHP 获取并解析 JSON 显示在页面中 2019-04-21
js php排序表格,javascript实现对表格元素进行排序操作_javascript技巧 2019-04-21
php sspi,php 内置的 web 服务器 php -s 2019-04-21
java生成结果集向量,如何解释H2o深度学习输出向量? 2019-04-21
matlab 曲线拟合求导,如何对matlab cftool拟合得到的cfit函数求导数 2019-04-21
matlab 50hzquchu,新手求消除50HZ工频干扰陷波滤波器源程序 2019-04-21