java反射的那点事

一、开场白

想必学java的小伙伴对反射都不陌生吧,反射在我们的开发中实用性很大,你用好了反射,你的代码整洁、代码性能、代码优化等都会大幅度的提高,所以不会用反射的小伙伴要多多学习了;下面我给大家说说反射的实用性。

二、概念以及作用

1.  概念:

     Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制;

2.  运用:

首先大家要明白一点,咱们写的代码是存储在后缀名是 .java的文件里的,但是它会被编译,最终真正去执行的是编译后的 .class文件。Java是面向对象的语言,一切皆对象,所以java认为 这些编译后的 class文件,这种事物也是一种对象,它也给抽象成了一种类,这个类就是Class,大家可以去AIP里看一下这个类;

https://tool.oschina.net/apidocs/apidoc?api=jdk-zh

 

<1> 通过反射创建对象

我们下面来举一个例子,下面这个例子就是创建了一个class对象

Class user= Class.forName("com.test.User");

但是我们想要new一个对象咋办?下面就来通过反射new一个无参对象;

User user= Class.forName("com.test.User").newInstance();

这样我们就把对象new好了,可以使用user中的方法了,但是我要构造有参的咋办,不要急下面我们来构造一个;

Class user= Class.forName("com.test.User");
Constructor c=clazz.getConstructor(String.class,int.class);//获取有参构造
User user=(User ) c.newInstance("sanmao",12);    //通过有参构造创建对象

好了我们通过反射构造对象就到这了。

 

<2> 通过反射机制来获取属性的类型

我们下面来举一个例子,获取单个属性的返回值

Field field = User.class.getDeclaredField("name");
System.out.println(field.getName()); //获取属性name的
System.out.println(field.getType());//获取属性类型 class的

下面是获取所有属性的返回值

Field[] fields = User.class.getDeclaredFields();
System.out.println(field.getName()); //获取属性name的
System.out.println(field.getType());//获取属性类型 class的

还有其他返回值,大家可以打断点研究研究,我就写这两个值。

 

<3> 通过反射来set,get值

https://tool.oschina.net/apidocs/apidoc?api=jdk-zh

 我们下面来举一个例子,获取单个属性并且set值

// 获取bean的某个属性的描述符  
PropertyDescriptor propDesc = new PropertyDescriptor(name, User.class);  
// 获得用于写入属性值的方法  
Method methodSetName = propDesc.getWriteMethod();  
// 写入属性值  
methodSetName.invoke(user, "wong");  

 我们下面来举一个例子,获取单个属性并且get值

// 获取Bean的某个属性的描述符  
PropertyDescriptor proDescriptor = new PropertyDescriptor(name, User.class);  
// 获得用于读取属性值的方法  
Method methodGetrName = proDescriptor.getReadMethod();  
// 读取属性值  
Object objName = methodGetName.invoke(user);  

 我们下面来举一个例子,获取所有属性并且set、get值

        BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass(), Object.class);
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor p : propertyDescriptors) {
            //获得属性名称
            String name = p.getName();
            Map<String, Object> map = new HashMap<>();
            //调用该属性名称对应的getter方法
            Object obj = new PropertyDescriptor(p.getName(), User.class).getReadMethod().invoke(user);
            //调用该属性名称对应的setter方法
            new PropertyDescriptor(p.getName(), User.class).getWriteMethod().invoke(user, obj);
        }

 

上面所说的几个反射都是最常用的,大家如果遇到其他的问题,可以来联系我,请关注下面的公众号留言。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章