反射总结
发布日期:2021-08-15 09:34:12 浏览次数:2 分类:技术文章

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

java里面的反射是一个非常好用的东西。

通常情况下,我们使用关键字new,由一个类生成一个对象;而反射是根据已经存在的对象,来获取类里面的内容。

一个类通常由三部分组成,构造器(构造函数)属性方法,通过反射就可以从一个具体的实例获取到类的构造器、属性和方法。

Java的反射机制需要借助四个类来实现,分别是Class(类)、Constructor(构造器)、Field(属性)、Method(方法)。

Demo:

以User类为例,User包含有姓名、性别、年龄三个属性,两个构造函数,get和set方法以及print方法。

public class User {		private String name;//姓名	private String gender;//性别	private int age;//年龄		public User(){}		public User(String name,String gender,int age){		this.name=name;		this.gender=gender;		this.age=age;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getGender() {		return gender;	}	public void setGender(String gender) {		this.gender = gender;	}	public int getAge() {		return age;	}	public void setAge(int age) {		this.age = age;	}		public void print(){		System.out.println("name:"+name+",gender:"+gender+",age:"+age);	}}

main函数:根据User实例,获取了User类信息、构造器、字段信息、方法信息、并执行了print函数。

public class Main {		public static void main(String args[]){		User user = new User("张三","男",18);		reflect(user);	}		public static void reflect(Object obj){				//获取类信息		Class cl = obj.getClass();				//1.获取构造器		System.out.println("构造器");        Constructor[] cons=cl.getConstructors();        for(Constructor constructor:cons){        	System.out.println(constructor.toString());        }                //2.获取字段信息        System.out.println("字段信息");        Field[] fields = cl.getDeclaredFields();        for(Field f : fields){        	try {                   f.setAccessible(true); // 设置些属性是可以访问的                  String type = f.getType().toString(); // 得到此属性的类型                  String name = f.getName();// 得到属性的名称                  System.out.println(type+" "+name);            } catch (Exception e) {                  e.printStackTrace();              }        }                //3.获取方法信息        System.out.println("函数信息");        Method[] methods = cl.getMethods();        for(Method m : methods){        	System.out.println(m.toString());        }                //4.执行函数        System.out.println("执行函数");        try{            Method m = cl.getMethod("print");            m.invoke(obj);        }catch(Exception e){        	e.printStackTrace();        }          	}}

执行结果:

构造器public User()public User(java.lang.String,java.lang.String,int)字段信息class java.lang.String nameclass java.lang.String genderint age函数信息public java.lang.String User.getName()public void User.setName(java.lang.String)public void User.print()public void User.setGender(java.lang.String)public java.lang.String User.getGender()public int User.getAge()public void User.setAge(int)public final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) 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 java.lang.String java.lang.Object.toString()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()执行函数name:张三,gender:男,age:18

转载于:https://www.cnblogs.com/huangbei1990/p/6168973.html

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

上一篇:<剑指offer> 第15题
下一篇:Dreamweaver 中CSS代码格式化

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月20日 16时39分40秒

关于作者

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

推荐文章

redis持久化, RBD(Redis Database)和AOF(Append Only File) 2021-06-29
boost::bad_function_call用法的测试程序 2021-06-29
boost::function_types::is_callable_builtin用法的测试程序 2021-06-29
微信公众号介绍_以及注册订阅号---微信公众号开发工作笔记0001 2021-06-29
Vue模板语法---vue工作笔记0003 2021-06-29
Vue计算属性之基本使用---vue工作笔记0004 2021-06-29
Vue监视---vue工作笔记0005 2021-06-29
Vue条件渲染---vue工作笔记0008 2021-06-29
Vue事件处理_vue的事件处理超级方便_功能强大---vue工作笔记0011 2021-06-29
Vue表单数据自动收集---vue工作笔记0012 2021-06-29
Vue生命周期---vue工作笔记0013 2021-06-29
ES6-ES11新特性_ECMAScript_简单介绍---JavaScript_ECMAScript工作笔记001 2019-04-26
ES6-ES11新特性_ECMAScript相关名词介绍_---JavaScript_ECMAScript工作笔记002 2019-04-26
ES6新特性_let变量声明以及声明特性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记003 2019-04-26
Sharding-Sphere,Sharding-JDBC_介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记001 2019-04-26
Sharding-Sphere,Sharding-JDBC_分库分表介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记002 2019-04-26
C++_类和对象_对象特性_构造函数的分类以及调用---C++语言工作笔记041 2019-04-26
C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042 2019-04-26
C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043 2019-04-26
C++_类和对象_对象特性_深拷贝与浅拷贝---C++语言工作笔记044 2019-04-26