Java反射原理(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))
1.将Java文件保存到本地硬盘
2.编译Java文件,生成.class文件
3.使用Java虚拟机(JVM)将字节码文件加载到内存
4.字节码文件在内存中使用Class类表示
5.使用反射的时候,首先获取到Class类,就可以得到class文件里的所有内容,包含属性、构造方法、普通方法
6.属性通过Filed类表示
7.构造方法通过Constructor表示
8.普通方法通过Method表示
即JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。
1、获取类对象:
通过类名获取Class对象,Class
通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();
2、获取类中的构造方法:


3、获取类中的属性:


4、获取类中的方法:


获取class的三种方式
先定义一个实体类Person:
Package reflex;
public class Person {
1 |
|
}
获取class方法
1、对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
// 类型的对象,而我不知道你具体是什么类,用这种方法
1 |
Person p1 = new Person(); |
2、类名.class 的方式得到,该方法最为安全可靠,程序性能更高
// 这说明任何一个类都有一个隐含的静态成员变量 class
1 |
Class c2 = Person.class; |
3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
// 但可能抛出 ClassNotFoundException 异常
1 |
Class c3 = Class.forName("reflex.Person"); |
需要注意的是:一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 c1,c2,c3进行 equals 比较,发现都是true。代码如下:
1 |
Class class1 = Person.class; |
Class具有的部分方法如下:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
Class能实现的功能
1判断对象属于哪个类
1 |
Person person = new Person(); |
输出:class2:class reflect.Person
2获取类信息
1 |
Class class1 = Person.class; |
3构建对象
1 |
Person person = new Person(); |
4动态执行方法
1 |
Class class1 = Person.class; |
5动态操作属性
1 |
Class class1 = Person.class; |
//age默认值是18
1 |
field.set(person,22); |
6动态代理




近期评论