反射之字段、方法、构造器的调用(二)
来源:互联网 发布:linux 返回上级目录 编辑:程序博客网 时间:2024/05/26 02:52
作者:叁念
反射之字段、方法、构造器的调用(二)
本文接上一篇文章 :反射的概念以及获取方法(一) 点击跳转
1.Class类型 - 类的类型
获取类型对象
1. Class.forName(完整类名)
2. 类名.class
3. 对象.getClass()
常用方法
getName() 获取完整类名
getSimpleName() 获取简单类名
getDeclaredFields() 获取类中所有属性
getDeclaredMethods() 获取类中所有方法
getDeclaredConstructors() 获取类中所有构造器
newInstance() 实例化类的对象(公开的无参构造)
2.Field类型 - 属性的类型
常用方法
getName() 获得属性名
getType() 获得属性的类型
get(Object obj) 获取obj对象中的这个属性的值
set(Object obj, Object value) 将obj对象中这个属性的值设置为value
setAccessible(true) 允许访问
package com.sannian;import java.lang.reflect.Field;public class Demo01 { public static void main(String[] args) {/******************* 使用字段 *************************/ try { Class<?> c = Class.forName("com.sannian.Student"); /**构造对象*/ Object student = c.newInstance(); //输出:com.sannian.Student// System.out.println(student.getClass().getName()); /**设置name字段*/ /**拿出name这个属性的对象*/ Field name = c.getField("name"); /**把张三放入student对象的姓名字段*/ name.set(student, "张三"); /**取出student对象的姓名字段*/ Object obj = name.get(student); //输出:张三 System.out.println(obj); /**设置age字段*/ Field age = c.getField("age"); age.set(student, 18); /**取出age字段并打印*/ System.out.println(age.get(student)); /**设置私有的money字段*/ Field money = c.getDeclaredField("money"); money.setAccessible(true); money.set(student, 100); System.out.println(money.get(student)); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } }}
3.Method类型 - 方法的类型
常用方法
getName() 获取方法名称
getReturnType() 获取返回值类型
invoke(Object obj, Object… args) 调用obj对象的这个方法,参数列表为args
getTypeParameters() 获取参数列表
package com.sannian;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Demo03 { /******************* 通过反射调用方法 *************************/ public static void main(String[] args) { try { Class<?> c = Class.forName("com.sannian.Student"); Object student = c.newInstance(); /**获取introduce方法,无参数,无返回值*/ Method introduce = c.getMethod("introduce", null); introduce.invoke(student, null); /**获取say方法,有一个String参数,无返回值*/ Method say = c.getMethod("say", String.class); say.invoke(student, "用放射调用的方法"); /**获取add方法,有2个int参数,有一个int返回值*/// Method add = c.getMethod("add", int.class,int.class); //写法一 Method add = c.getMethod("add", new Class[]{int.class,int.class});//写法一 Object obj = add.invoke(student, 1,2);// Object obj = add.invoke(null, 1,2); //因为static 所以可不不传入对象 System.out.println(obj); /**获取私有play方法*/ Method play = c.getDeclaredMethod("play", null); play.setAccessible(true); play.invoke(student, null); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } }}
package com.sannian;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Modifier;public class Demo04 { public static void main(String[] args) { try { Class<?> c = Class.forName("com.sannian.Student"); //读取所有构造器 Constructor<?>[] constructors = c.getConstructors(); for (int i = 0; i < constructors.length; i++) { String modi = Modifier.toString(constructors[i].getModifiers()); String list = "("; Class<?>[] parameterTypes = constructors[i].getParameterTypes(); for (int j = 0; j < parameterTypes.length; j++) { list += parameterTypes[j].getSimpleName(); if(j < parameterTypes.length - 1) { list += ","; } } list += ")"; System.out.println(modi + " " + c.getSimpleName() + " " + list); } //分别调用 //1.无参构造// Object o1 = c.newInstance(); Constructor<?> con0 = c.getConstructor(); Object obj1 = con0.newInstance(); //2.有参构造 Constructor<?> con1 = c.getConstructor(String.class); Object obj2 = con1.newInstance("张三"); //3.2个参数构造 Constructor<?> con2 = c.getConstructor(String.class,int.class); Object obj3 = con2.newInstance("李四",18); System.out.println(obj1); System.out.println(obj2); System.out.println(obj3); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
阅读全文
0 0
- 反射之字段、方法、构造器的调用(二)
- java反射之Class类、构造器、方法、字段、数组
- java基础之通过反射获得和使用类的字段、方法、构造器,等
- 反射(构造方法,方法,main,字段)
- (104)反射:获取Class的对象、构造函数、字段、方法。反射实例练习
- C#反射的学习(二)--访问字段、属性、方法
- JAVA高新技术反射机制的原理之构造函数、普通方法和字段
- 反射(构造方法Constructor的反射)
- 【类反射】类的调用(调用类中的成员:成员变量、方法、构造方法)
- 反射调用方法和反射时传递带参数的构造器
- Java反射之调用构造方法and操作数组
- 通过反射调用類的方法,屬性,字段,索引器(2種方法)
- 反射工具类(调用父类的方法和字段)
- 如何使用Java的反射机制以及调用构造方法?
- java反射机制 以及通过反射获得类的变量字段,方法,构造函数
- java反射机制 以及通过反射获得类的变量字段,方法,构造函数
- Java:反射构造的调用
- Java反射学习总结二(用反射调用对象的私有属性和方法)
- ES6 函数的拓展
- 祝大家双旦快乐——点开有彩蛋哦
- 【python】【穆晨】【171224】连续第七十五天总结
- LeetCode Remove Duplicates from Sorted Array
- Python3.6 在win10下安装xlwings
- 反射之字段、方法、构造器的调用(二)
- 目前使用过的不经常使用的函数
- Redis 主从配置心得及其高可用方案
- git 初学使用
- python数据类型和变量
- LeetCode题解 第十五周
- Redis 内存淘汰机制
- 6.6
- Bash游戏 V2