Java之反射

反射就是把Java类中的各种成分映射成一个个的java对象。


1.Java反射常用类

Class类—可获取类和类的成员信息 
Field类—可访问类的属性  
Method类—可调用类的方法 
Constructor类—可调用类的构造方法

2.如何使用反射

1.导入java.lang.reflect.* 

2.获得需要操作的类的Java.lang.Class对象 

3.调用Class的方法获取Field、Method等对象 

4.使用反射API进行操作 (设置属性﹑调用方法)

3.Class类

1)Class类是Java 反射机制的起源和入口

每个类都有自己的Class 对象且每一个类只有一个class 对象
用于获取与类相关的各种信息
提供了获取类信息的相关方法
Class类继承自Object类

2)Class类存放类的结构信息

这里写图片描述

3)【类对象】获取类的Class 对象

方法1:对象.getClass()
    Person person = new Person();
Class class2 = person.getClass();

方法2:类.class
    Class class1 = Person.class;

方法3:Class.forName()
    Class class3 = Class.forName("com.qf.demo.Person");
    使用forname方法,参数为相对于本工程的Person类文件路径

4)【属性】获取Field 对象

【只能获取public的属性】Field[] fields = class1.getFields();
【获取所有属性】Field[] fields2 =  class1.getDeclaredFields();

public属性

    【得到指定的属性对象】Field field = class1.getField("age");
    【 给属性赋值】field.set(object, 5);
    【得到属性值,返回的是对象】Object object2 = field.get(object);

静态属性

    【获取属性对象】Field field2 = class1.getDeclaredField("weight");
    【属性赋值】field2.set(null, 10);
    【获取属性值】Object object3 = field2.get(null);

私有属性

    Field  field3 = class1.getDeclaredField("name");
    【设置权限】field3.setAccessible(true);
    field3.set(object, "小花");
    Object object4 = field3.get(object);

5)【方法】获取Method 对象

--Method[] methods = class1.getMethods();// 得到【本类和父类】的【非私有】的方法

--Method[] methods2 = class1.getDeclaredMethods();// 得到【本类】中声明的所有的方法【包括私有】

--【得到无参无返回值方法】Method method = class1.getMethod("eat", null);
【方法调用】method.invoke(object, null);// 参数1:对象;参数2:方法参数

--【得到有参无返回值方法】Method method2 = class1.getMethod("drink", String.class);
【方法调用】method2.invoke(object, "水");

--【得到无参有返回值方法】Method method3 = class1.getMethod("sleep", null);
【调用】Object  object2 = method3.invoke(object, null);//返回值都是用对象接收

--【静态方法】Method method4 = class1.getMethod("hehe", null);
【调用,不需要传对象】method4.invoke(null, null); 

--【私有方法】Method method5 = class1.getDeclaredMethod("play", null);
【必须设置访问权限】method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
【调用】method5.invoke(object, null);

6)【构造方法】获取Constructor对象

【获取所有构造方法】Constructor[] constructors = class1.getConstructors();

【得到无参的构造方法】Constructor constructor = class1.getConstructor(null);
【创建对象】Person person = (Person) constructor.newInstance(null);

【得到有参的构造方法】Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
【创建对象】Person person2 = (Person) constructor2.newInstance("张三",5,9);

4.反射优缺点

优点

    1 提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力
    2 允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点

    性能问题
    代码维护问题
    可以使用私有的属性和方法,破坏了代码块的安全性
posted @ 2017-05-05 19:23  TCB_Java  阅读(187)  评论(0编辑  收藏  举报