趣文网 > 作文大全

简析:Java反射 Java反射定义 反射的基石

2020-12-02 04:05:01
相关推荐

Java反射定义

在程序运行过程中,对于任意一个类,可以获得该类的属性和方法;对于任意一个对象,可以调用该对象的任意一个属性和方法。

在运行时动态获取类的信息和动态调用对象的属性和方法称为Java反射机制。

反射的基石

字节码文件对象----->Class对象-----Class是Java中的一个类型

定义一个类 class A{ }----->class是Java中的关键字,用来定义类

字节码文件------ XXX.class文件

java源文件进行编译(javac)之后的.class文件

字节码文件对象

jvm吧字节码文件加载到jvm内存中去,jvm就认定这个字节码文件是一个字节码文件对象

如何获取字节码文件对象

1.Object类的getClass()

2.类型.class属性

3.Class.forName("类的全路径名")【最常用】

获取字节码文件对象三种方式1.通过Object类的getClass()2.通过类型.class3.通过Class.forName("类型名")[类型名:类的全路径名]

在一次程序的运行过程中,通过同一个类创建的字节码文件对象是同一个。// 1.通过Object类的getClassPerson p1 = new Person();Person p2 = new Person();

Class class1 = p1.getClass();Class class2 = p2.getClass();

System.out.println(class1 == class2);

// 控制台打印true

// 2.通过类型.classClass class3 = Person.class;System.out.println(class1 == class3);

// 控制台打印true

// 3.通过Class.forName("类型名")[最常用](需要处理异常throws或者try...catch..finally)Class class4 = Class.forName("com.study.Person");System.out.println(class1 == class4);

// 控制台打印true

使用字节码文件对象字节码文件对象中包含什么?类 字节码文件对象构造方法(构造器) 构造方法(构造器)对象(类型Constructor)

成员变量 成员变量对象(类型Field)

成员方法 成员方法对象(类型Method)

用字节码文件对象去构建一个类的对象之前一直是用new 的形式去构建一个类的对象Person p = new Person();Person()是类的构造方法,因为对象是通过构造方法来创建。

用字节码文件中的构造方法对象来创建一个类的对象-----Constructor对象// 获得字节码文件对象Class clazz = Class.forName("com.study.Person");// 得到字节码文件对象中的构造器对象// 获取构造器对象数组(公共的构造器)Constructor[] constructors = clazz.getConstructors();// 获取具体的某个构造器对象Constructor c = constructors[0];// 调用newInstance()方法创建对象Object person = c.newInstance();

// 便捷方式// 直接调用clazz的newInstance()创建类对象[注意:该类必须有默认的构造方法]Object person2 = clazz.newInstance();

构造方法对象(类型Constructor)

// 获取字节码文件对象Class clazz = Class.forName("com.study.Person");

// 获取字节码文件对象中的构造器对象// getConstructors()只能得到公共的构造器对象Constructor[] constructors = clazz.getConstructors();// getDeclaredConstructors()得到所有声明的构造器对象Constructor[] declaredConstructors = clazz.getDeclaredConstructors();

// 得到指定的构造器对象(公共的构造器)/** public Person(String name, int age)*/Constructor c1 = clazz.getConstructor(String.class, int.class);// 传形参Object person1 = c1.newInstance("zhangsan", 18);// 传实参

// 得到非公共的指定构造器对象/** Person(String name)*/Constructor c2 = clazz.getDeclaredConstructor(String.class);// 传形参Object person2 = c2.newInstance("lisi");

/** private Person(int age)*/Constructor c3 = clazz.getDeclaredConstructor(int.class);// 传形参// 可以得到构造器对象,但是无法使用它创建对象// 暴力访问c3.setAccessible(true);Object person3 = c3.newInstance(18);

成员方法对象(类型Method)// 获取字节码文件对象Class clazz = Class.forName("com.study.Person");

// 得到字节码文件对象中的所有公共的Method对象// getMethods()只能获取public修饰的方法(包含父类中的)Method[] methods = clazz.getMethods();

System.out.println(methods.length);

for (Method m : methods) {System.out.println(m);}

// getDeclaredMethods() 获取所有修饰符下的方法Method[] declaredMethods = clazz.getDeclaredMethods();

System.out.println(declaredMethods.length);

for (Method m : declaredMethods) {System.out.println(m);}

// 得到特定的方法 需要知道方法名、形参类型// getMethod(方法名,形参列表) 只能得到public修饰的方法Method method = clazz.getMethod("method", String.class);

// 调用方法// 传统调用方法方式:对象.方法(实参);

// 创建方法所在类的对象Object person1 = clazz.newInstance();// 反射调用方法方式:方法.invoke(对象,实参);Object m1 = method.invoke(person1, "张三"); // m 为返回值System.out.println(m1);

// getMethod(方法名,形参列表) 只能得到public修饰的方法Method declaredMethod = clazz.getDeclaredMethod("method", String.class, int.class);

// 调用方法// 传统调用方法方式:对象.方法(实参);

// 创建方法所在类的对象Object person2 = clazz.newInstance();// 私有方法需要暴力访问declaredMethod.setAccessible(true);// 反射调用方法方式:方法.invoke(对象,实参);Object m2 = declaredMethod.invoke(person2, "张三", 18); // m 为返回值System.out.println(m2);

成员变量对象(类型Field)

// 获取字节码文件对象Class clazz = Class.forName("com.study.Person");

// 得到所有的public修饰的成员变量Field[] fields = clazz.getFields();

for (Field f : fields) {System.out.println(f);}

// 得到所有的成员变量Field[] declaredfields = clazz.getDeclaredFields();

for (Field f : declaredfields) {System.out.println(f);}

// 得到指定的public修饰的成员变量对象 需要知道成员变量的名字Field field = clazz.getField("age");// 反射设置属性 属性名.set(对象,实参)// 获取对象Object person1 = clazz.newInstance();// 设置属性值field.set(person1, 18);

// 得到指定的成员变量对象(所有声明的) 需要知道成员变量的名字Field declaredField = clazz.getDeclaredField("name");// 反射设置属性 属性名.set(对象,实参)// 获取对象Object person2 = clazz.newInstance();// 设置属性值declaredField.set(person2, "zhangsan");

应用:

ide(eclipse、idea),自动提示功能,对象(提示:属性、方法)

servlet如何创建对象? Servlet是由Tomact根据配置的类全路径信息通过Java反射机制进行创建。

最后,咱给小编:

1. 点赞+评论

2. 点头像关注,转发给有需要的朋友。

谢谢!!

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

学校过六一儿童节作文 读书类作文600字初中 种玉米作文200字 值得我尊敬的一个人作文 三年级书信作文300字 一件有趣的事作文450字 湖南语文高考作文题目 我学会了煮方便面作文 写事的作文100字左右 我想对老师说作文400字 蓝天保卫战英语作文 男朋友打女朋友屁股作文 我渴望时光倒流作文 我会做家务作文300字 中考作文没写完扣几分 online shopping 英语作文 八年级上册英语第五单元作文 我最喜欢的动物作文400字 我的理想作文500字医生 以方法为话题的作文 这也是课堂作文400字 粽叶飘香作文600字 红楼梦读后感作文500字 以成长为话题写一篇作文 作文快乐的端午节300字 以变为题的作文600字 从不同角度看问题的作文 自考大学语文作文范文 最美的行囊作文800字 我的端午假期英语作文