使用java反射机制,获取已存在类的信息

''如果 2019-09-01 03:20:16
使用java反射机制,获取已存在类的信息 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 二、代码示例 构建Students类 package com.whtcc.person; public class Students { private String stu_name; private int stu_age; public Students() { super(); // TODO Auto-generated constructor stub } public Students(String stu_name, int stu_age) { super(); this.stu_name = stu_name; this.stu_age = stu_age; } public String getStu_name() { return stu_name; } public void setStu_name(String stu_name) { this.stu_name = stu_name; } public int getStu_age() { return stu_age; } public void setStu_age(int stu_age) { this.stu_age = stu_age; } public void study(int a,int b) { System.out.println("学生正在学习。。。计算a+b=="+(a+b)); } } 编写测试类 package com.whtcc.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import com.whtcc.person.Students; public class Main { public static void main(String[] args) { try { //通过反射获得Students对象 Class<?> stuClass=Class.forName("com.whtcc.person.Students"); Students stu2=(Students) stuClass.newInstance(); //测试是否能调用Students类的study方法 stu2.study(3,2); //获取name_field属性对象 Field name_field=stuClass.getDeclaredField("stu_name"); //设置name_field属性对象取消权限检查 name_field.setAccessible(true); //创建Students对象stu1 Students stu1=new Students("Mary",15); //打印stu1的name属性值 String namestr=(String)name_field.get(stu1); System.out.println("stu1的name=="+namestr.toString()); //修改stu1的name属性值为jike,并输出至控制台 name_field.set(stu1, "jike"); String newnamestr=(String)name_field.get(stu1); System.out.println("stu1的新name=="+newnamestr.toString()); //获取age_field属性对象及相关操作 Field age_field=stuClass.getDeclaredField("stu_age"); age_field.setAccessible(true); System.out.println("stu1对象的age值=="+age_field.getInt(stu1)); //获取age_field属性修饰符类型 int modifier=age_field.getModifiers(); System.out.println("stu1对象的age值修饰符=="+Modifier.toString(modifier)); //获取age_field属性名称 System.out.println("stu1对象的age值属性名称=="+age_field.getName()); System.out.println("-----------------------------------------------------------"); /* * *通过反射获取并调用对象的方法(以study方法为例) */ Method method=stuClass.getMethod("study",int.class,int.class); //获取study方法的修饰符 System.out.println("study方法的权限修饰符是"+Modifier.toString(method.getModifiers())); //获取study方法的返回值类型 System.out.println("study方法的返回值类型是"+method.getReturnType().getName()); //获取study方法的参数列表 Class<?>[] parameterTypes=method.getParameterTypes(); System.out.println("参数列表="+Arrays.toString(parameterTypes)); //调用study方法 method.invoke(stu1, 6,5); //更改stu1对象的属性 Method setnameMethod = stuClass.getDeclaredMethod("setStu_name", String.class);//第一个参数是方法名称,第二个参数是方法参数类型的类类型 setnameMethod.invoke(stu1, "tony"); System.out.println("stu1的新名字是"+stu1.getStu_name()); /* * 拓展:使用反射调用ArrayList类的方法 */ Class<?> cla=Class.forName("java.util.ArrayList"); Method method2=cla.getMethod("add", Object.class); ArrayList<String> alt=(ArrayList<String>) cla.newInstance(); method2.invoke(alt, "we are family"); System.out.println(alt); //通过反射获取构造器对象 Constructor<?> constructors=stuClass.getConstructor(); Constructor<?> constructors1=stuClass.getConstructor(String.class,int.class); Students s1=(Students) constructors.newInstance(); Students s2=(Students) constructors1.newInstance("fa",19); } catch (Exception e) { e.printStackTrace(); } } }
...全文
71 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧