反射的操作方法
发布日期: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();
方法二Classc=(Class )Class.forName("Reflect.User");User u1=c.newInstance();
2)有参构造
Constructorc=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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月13日 10时12分10秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
rtsp 华为_华为多实例生成树RSTP配置详解
2019-04-21
ewb交通灯报告和文件_基于ewb平台的交通灯电路设计.doc
2019-04-21
mysql中$使用_在MySQL中使用序列的简单教程
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
php显示json,使用 PHP 获取并解析 JSON 显示在页面中
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