反射之字段、方法、构造器的调用(二)

来源:互联网 发布: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
原创粉丝点击