博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射机制
阅读量:5922 次
发布时间:2019-06-19

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

一、创建一个类

package sinldo;public class Person {     String  name;    private int age;    public Person() {        System.out.println("无参构造器");    }    public Person(String name,int age) {        System.out.println("有参构造器");        this.name=name;        this.age=age;    }    private void privaetMethod() {            }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public void setName(String name, int age) {        System.out.println("name: "+name);        System.out.println("age: "+age);    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + "]";    }    }

 

二、3种获得反射的方式

Class class1=null;//获得Class对象        //3种反射方式        //1.类.class        class1=Person.class;        //2.对象.getClass        Person person=new Person();//        class1=person.getClass();        //3.根据全类名,使用方法forName,此方法用的最多        try {            class1=Class.forName("sinldo.Person");//        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }//全类名

三、创建对象

Object per = class1.newInstance();//该方法获取的对象只能使用object的方法        Person per2=(Person) class1.newInstance();//这样就可以使用Person类的方法

四、获取方法

  1.获取所有普通方法,不包括私有方法

//获取方法        Class
class2=Class.forName("sinldo.Person"); //1.得到对应的类中有哪些方法,不能获取私有方法,获取的普通方法,不能获取构造函数 Method[] methods = class2.getMethods(); for (Method method : methods) { System.out.println("方法;"+method); }

   2.获取所有方法,包括私有方法,但是不能获取继承类的方法

//2.获取所有方法,包括私有方法,只能获取本类声明的方法,不能获取继承的类        Method[] declaredMethods = class2.getDeclaredMethods();        for (Method method : declaredMethods) {            System.out.println("getDeclaredMethods():"+method);        }

    3.获取指定的方法

//3.获取指定的方法,第一个是参数是方法名,后面的参数是方法里的参数        Method Method_setName = class2.getDeclaredMethod("setName", String.class);        System.out.println("setName方法: "+Method_setName);                Method Method_setName2=class2.getDeclaredMethod("setName", String.class,int.class);        System.out.println(Method_setName2);

      执行方法

//执行方法        //要使用方法,先要创建一个对象,为执行方法做准备        Object obj = class2.newInstance();//获取一个对象            //第一个参数是对象名,后面的参数是方法的参数        Method_setName2.invoke(obj, "xuejie",23);

 

 

五、获取字段

获取所有字段

Field[] declaredFields = class2.getDeclaredFields();       for (Field field : declaredFields) {        System.out.println("Person类的字段: "+field);       }

1.获取指定对象的Field的值

//1.获取制定名字的Field        Field personField_name = class2.getDeclaredField("name");        System.out.println("指定的字段: "+personField_name.getName());

2.针对已声明的对象,获取指定的Field的值,但是这个Field不能是私有的。

//2.获取指定对象的Field的值,这个Field不能是私有的,不然获取不了        Person per3=new Person("xue", 12);        Object object = personField_name.get(per3);        System.out.println("获取指定对象的‘name’的Field的值: "+object);

3.设置指定对象的Field的值

 

//3.设置指定对象的Field的值 //第一个参数是对象名,第二个参数是给指定字段设置的值         personField_name.set(per3, "zhao");        System.out.println("设置指定对象字段name的Field的值为: "+per3.name);

4.若字段是私有的,则需要调用setAccessible(true)方法

//4.若字段是私有的,则需要调用setAccessible(true)方法 Field personField_age = class2.getDeclaredField("age");        personField_age.setAccessible(true);        System.out.println("获取指定私有字段名: "+personField_age.getName());        Object object2 = personField_age.get(per3);        System.out.println("获取指定对象字段age的Field的值: "+object2);

六、获取构造器

1.获取所有的构造器

//获取构造器        //由Class对象的getConstructors()的方法获取所有的构造器        Constructor
[] constructors = (Constructor
[]) class2.getConstructors(); for (Constructor
constructor : constructors) { System.out.println("Person类的构造器: "+constructor); }

2.获取指定的构造器

//获取指定的构造器        Constructor
constructor = class2.getConstructor(String.class,int.class); System.out.println("指定的构造器: "+constructor);

调用构造器的newInstance()方法创建对象

Object newInstance = constructor.newInstance("xue",12);        System.out.println(newInstance);

 

转载于:https://www.cnblogs.com/xuesheng/p/7851655.html

你可能感兴趣的文章
采用vue+webpack构建的单页应用——私人博客MintloG诞生记
查看>>
解决你的前端面试
查看>>
[LeetCode/LintCode] Merge Intervals
查看>>
zhilizhili-ui 荡平ie8910 还我前端清净地
查看>>
Android自动化测试-从入门到入门(1)Hello Testing!
查看>>
react官方tutorial心得
查看>>
调查发现 Java 和 JavaScript 是企业开发的顶级语言
查看>>
阿里云RPA(机器人流程自动化)干货系列之三:阿里云RPA介绍 ...
查看>>
Python零基础学习代码实践 —— 提取字符串里面的单词数 ...
查看>>
CentOS7下安装RabbitMQ
查看>>
Nginx之5金钟罩 - (SSL)
查看>>
大数据在媒体行业的应用——《企业大数据实践路线》之二
查看>>
首次出手区块链创企,Facebook的区块链野望
查看>>
Dubbo 生态添新兵,Dubbo Admin 发布 v0.1
查看>>
结合P2P软件使用Ansible分发大文件
查看>>
12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!
查看>>
Rethink Deepfakes,浅谈深度学习落地
查看>>
阿里云搭建的最好代刷网
查看>>
android.support.v7.widget.SearchView开发记录(一)
查看>>
想做一个合格的C语言程序员,从这篇文章开始
查看>>