Java基础强化(一) – 反射
在学习完MyBatis与Spring技术之后,笔者决定先去巩固一些之前不牢固的java以及javaWeb基础。主要内容包括:反射、注解、并发与线程、servlet、request、response、监听器、过滤器、Maven。在扎实基础之后,再前往学习Spring的后续内容。
一、反射概述
1.反射:框架设计的灵魂
框架:半成品软件。在框架的基础上开发,可以简化编码。
反射:将类的各个组成部分封装为其他对象,这就是反射机制
2.好处:
(1)便于程序在运行过程中操作这些对象。
(2)可以解耦,提高程序的可扩展性
3.获取Class对象的方法:
(1)Class.forName(“全类名”):将字节码加载进内存,返回Class对象
多用于配置文件,将全类名定义在配置文件中。读取文件,加载类即可
(2)类名.class:通过类名的属性class获取
多用于参数的传递
(3)对象.getClass():getClass是Object类中的方法
多用于凭借对象获取字节码
同一个字节码文件(*.class)在一次运行过程中,只会被加载一次,不论通过上述哪种方式获取class对象,结果都是同一个
二、Class对象的功能
1.获取成员变量
/*返回一个Filed对象数组,保存本类及其父类的public成员变量*/
Field [] getFields();
/*返回一个Filed对象,该对象是指定名称的本类或父类public成员变量*/
Filed getFiled(String name);
/*返回一个Filed对象数组,保存本类的任意访问权限的成员变量*/
Filed [] getDeclaredFileds();
/*返回一个Filed对象,该对象是指定类名的本类的任意访问权限的成员变量*/
Filed getDeclaredFiled(String name) ;
2.获取构造函数
/*返回Class对象类的所有public构造器*/
Construcator [] getConstructors();
/*返回Class对象类中的指定名字的public构造器*/
Constructor getConstructor(String name);
/*返回Class对象类中所有构造器*/
Constructor [] getDeclaredConstructors();
/*返回Class对象类中指定名字的构造器*/
Constructor getDeclaredConstructor(String name);
实例程序:
/*创建Teacher的Class对象类*/
Class class5 = Class.forName("domain.Teacher");
/*获取Teacher的所有构造函数*/
Constructor []constructors = class5.getConstructors(); //teacher中有两个构造函数
/*打印Teacher的所有构造函数*/
for(Constructor constructor : constructors){
System.out.println(constructor);
}
/*
public domain.Teacher()
public domain.Teacher(java.lang.String,java.lang.Integer)
*/
3.获取成员方法
/*获取Class对象类与其父类的所有public方法*/
Method [] getMethods();
/*获取Class对象类与其父类的指定名称的public方法*/
Method getMethod (String name);
/*获取Class对象类的所有方法*/
Method[] getDeclaredMethods()
/*获取Class对象类的指定名称的方法*/;
Method getDeclaredMethod(String name);
实例程序
/*创建Teacher的Class对象类*/
Class class5 = Class.forName("domain.Teacher");
/*获取Teacher类中的无参teach方法*/
Method method1 = class5.getMethod("teach");
/*获取Teacher类中的有参teach方法*/
Method method2 = class5.getMethod("teach", String.class);
/*打印Teacher类中的两个teach方法*/
System.out.println(method1);
System.out.println(method2);
/*
public void domain.Teacher.teach()
public void domain.Teacher.teach(java.lang.String)
*/
4.获取类名
String getName();
三、Filed类
Filed类的常用方法
(1) Object get(Object obj);
获取obj对象中该成员变量的值.
/*创建Teacher类的实例化对象teacher1*/
Teacher teacher1 = new Teacher();
/*将teacher1中name的值设成"李老师"*/
teacher1.setName("李老师");
/*获取Teacher的Class对象类*/
Class class0 = Class.forName("domain.Teacher");
/*获取Teacher中的name成员变量*/
Field name = class0.getField("name");
/*打印Teacher中的name成员变量*/
System.out.println(name.get(teacher1));
/*李老师*/
(2) void set(Object obj,Object value);
将obj对象中该成员变量的值设成value
/*通过field的set方法将teacher1对象的name值设成"王老师"*/
name.set(teacher1,"王老师");
/*打印Teacher中的name成员变量*/
System.out.println(name.get(teacher1));
/*王老师*/
(3)setAccessible(boolean flag);
若程序要访问私有成员变量的值,则需要通过本函数进行访问权限设置,即暴力反射
/*将对象teacher1的age值设成40*/
teacher1.setAge(40);
/*获取Teacher中的age成员变量*/
Field age = class.getDeclaredField("age");//age为私有变量,不能用getField函数
age.setAccessible(true);//暴力反射
/*打印teacher1对象中age的值*/
System.out.println(age.get(teacher1)); //40
四、Constructor类
Constructor类中的常用方法
(1)newInstance(Object… initargs)
根据构造器构造对象,参数为构造器所需参数
示例程序:
/*获取无参构造函数*/
Constructor constructor = class5.getConstructor();
/*用无参构造函数创建Teacher对象*/
Teacher teacher2 = (Teacher) constructor.newInstance();
/*获取双参构造函数*/
Constructor constructor1 = class5.getConstructor(String.class,Integer.class);
/*用双参构造函数创建Teacher对象*/
Teacher teacher3 = (Teacher) constructor1.newInstance("李老师",40);
/*打印结果*/
System.out.println(teacher2);
System.out.println(teacher3);
/*
Teacher{name='null', age=null}
Teacher{name='李老师', age=40}
*/
五、Method类
Method类中的常用方法
(1)invoke(Object obj,Object… initargs)
执行被获取的方法,参数为执行该方法的对象,以及方法所需要的参数
示例程序:
/*获取无参构造函数*/
Constructor constructor = class5.getConstructor();
/*用无参构造函数创建Teacher对象*/
Teacher teacher2 = (Teacher) constructor.newInstance();
/*获取双参构造函数*/
Constructor constructor1 = class5.getConstructor(String.class,Integer.class);
/*用双参构造函数创建Teacher对象*/
Teacher teacher3 = (Teacher) constructor1.newInstance("李老师",40);
/*调用无参teach方法*/
method1.invoke(teacher3);
/*调用有参teach方法*/
method2.invoke(teacher3,"五年级一班");
/*
上课中
在五年级一班上课中
*/
以上teach方法实现如下:
public void teach(){
System.out.println("上课中");
}
public void teach(String classroom){
System.out.println("在" + classroom + "上课中");
}