------- <a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------
反射技术:可以动态的获取类以及类中的成员,并可以调用该类的成员。
以前是有什么类就可以new什么对象,(利用反射技术可以)没有类,给什么类就new什么对象。
所以在反射技术中,最重要的就是先获取到那个类,那么如何获取类?
无论new什么对象,都要先获取字节码文件(xx.class)
Java已对字节码文件进行了描述用的是:Class
字节码文件里都有:
名字
构造函数
属性(字段)
方法
获取以上内容的方式:getName();getFiled();getMethod();getConstrutor()
描述字节码文件的类Class
class Class
{string name;
constructor
filed
method
getName();getFiled();getMethod();getConstrutor()
}
每一个class文件都可以生成一个Class对象---------比如:小明是个实体,Demo.class也是个实体,那么想要操作Demo.class文件中的内容,只要拿到Demo.class文件的Class对象
接下来,如何获取一个字节码文件的对象?方式有3种
1. Object getClass()方法:
Person p = new Person();//调用getClass先有对象
Class cla = p.getClass();
注:在反射技术里,该方法不合适,因为反射技术不明确具体类
2.所有的数据类型都有自己对应的Class对象,表示方式很简单,每一个数据类型都有一个默认的静态属性。 .class 用该属性就可以获取到字节码文件对象。
(Person.class代表Person类型的Class对象)
这种方式虽然不用对象调用,但还是要用具体的类调用静态属性
3(重点,反射技术里最常用的方法)
查阅API文档Class,找到forName方法,通过名称就可以获取对应的字节码文件对象。
String className = "cn.itcast.domain.Person";//名称要写全
(上面那个错误一定要避免
这样写全,就会在classpath下找对应的类文件,找到成功,没找到就报异常)
Class cla = Class.forName(className);这一步加载完,Person类在内存中产生,并
封装成Class对象
反射用法
反射技术-动态的创建实例对象
下面,如何根据给定名称获取到指定的Class对象后(上面已完成) 建立该类的对象?
一.Object obj = clazz.newInstance();//创建一个Person对象,默认调用该类的空参构造函数
二.当给定类中没有空参构造函数时,可以先获取指定的构造函数,并再通过该构造函数进行实例化
步骤如下:
1. 通过Class的getConstructor(与之对应的参数类型对象)方法获取指定构造函数,比如带两个参数的
如:Constructor cons = clazz.getConstructor(String.class,int.class)
2.通过指定的构造器对象进行对象的实例化
Object obj = cons.newInstance(“xiaoming”,20);
反射技术-动态获取字段(Field)以及暴力反射
获取类的成员:
比如:getDeclaredField(String name)
08-反射技术-动态获取方法(Method)
获取定义的无参函数例子:
获取定义的静态的无参函数例子:
获取定义的带参数的,非静态的例子: