反射之字段、方法、构造器的调用(二)
2017-12-24 14:00
225 查看
作者:叁念
1. Class.forName(完整类名)
2. 类名.class
3. 对象.getClass()
常用方法
getName() 获取完整类名
getSimpleName() 获取简单类名
getDeclaredFields() 获取类中所有属性
getDeclaredMethods() 获取类中所有方法
getDeclaredConstructors() 获取类中所有构造器
newInstance() 实例化类的对象(公开的无参构造)
getName() 获得属性名
getType() 获得属性的类型
get(Object obj) 获取obj对象中的这个属性的值
set(Object obj, Object value) 将obj对象中这个属性的值设置为value
setAccessible(true) 允许访问
getName() 获取方法名称
getReturnType() 获取返回值类型
invoke(Object obj, Object… args) 调用obj对象的
b3e0
这个方法,参数列表为args
getTypeParameters() 获取参数列表
反射之字段、方法、构造器的调用(二)
本文接上一篇文章 :反射的概念以及获取方法(一) 点击跳转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对象的
b3e0
这个方法,参数列表为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(); } } }
相关文章推荐
- 【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
- C#反射新建类实例和调用类方法及属性帮助类 以及获取或设置对象属性中字段值帮助类
- 反射调用静态类的方法,字段
- java反射之Class类、构造器、方法、字段、数组
- java反射之Class类、构造器、方法、字段、数组
- 通过反射获取类属性字段 以及 调用类方法
- java基础之通过反射获得和使用类的字段、方法、构造器,等
- Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
- 解析如何使用反射调用类型成员 方法,字段,属性
- 利用反射机制,获取类的字段、方法、并实现简单调用
- 反射调用方法和反射时传递带参数的构造器
- 通过反射修改类的私有字段值,调用私有方法
- Java反射代码--07.根据字段调用所有set方法
- 通过反射调用類的方法,屬性,字段,索引器(2種方法)
- C#反射调用另外一个类中的私有字段和方法
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- 通过反射修改类的私有字段值,调用私有方法
- 【Android开发经验】利用反射机制,获取类的字段、方法、并实现简单调用
- 使用反射依导航路径调用对象成员方法,或返回对象子、孙属性或字段成员[转]