reflect(反射)

来源:互联网 发布:淘宝喵喵折 编辑:程序博客网 时间:2024/06/06 09:46

反射:

反射的概念:其实就是将 java中所有的后缀为.class的这一类事物描述为具体的一个类,通俗:反射就是一堆class文件,Class类描述的是所有的class文件的共性。

如果我要找到一个String.class  Class类的对象(实例Instance)

class文件被描述为Class

class文件中的属性被描述为Field

class文件中的方法被描述为Method

class文件中的构造函数被描述为Constructor

Class类的对象的获取:

package com.lsh.reflect;//javabean/实体public class User {private String name;private int age;public User(){}public User(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

package com.lsh.reflect;/** //通过反射获取对象的三种方式:* 1.类名.class属性* 2.new 类名().getClass()方法* 3.Class.forName(“包名+类名”)* */public class ReflectDemo {public static void getClazz() throws Exception{//获取User类的class对象//第一种方式:类名.class属性Class clazz1 = User.class;//第二种方式:new 类名().getClass()方法Class clazz2 = new User().getClass();//第三种方式:Class.forName(“包名+类名”)Class clazz3 = Class.forName("com.lsh.reflect.User");System.out.println(clazz1 == clazz2);//tureSystem.out.println(clazz2 == clazz3);//tureSystem.out.println(clazz1 == clazz3);//ture}public static void main(String[] args) throws Exception {getClazz();}}
输出结果为:

ture

true

true

既然可以使用三种不同的方式获取任意一个类的Class对象,那么在实际的项目开发中,到底使用哪一种呢?

由于反射主要的任务的是做框架开发,在这些已经实现的框架中完全使用的是反射技术。在一般的框架实现中都采用的是将类的完整路径配置在xml文件中,这样程序在启动的时候可以通过IO技术获取该类的全名,那么最常用的就是方式三获取该类的Class对象进行进一步在操作。

方式三:Class 变量名 = Class.forName("包名+类名");

总结:其实反射就是将class文件中的不同的部分都封装为具体的对象,进而便于操作。




0 0