Java基础强化(一) -- 反射

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 + "上课中");
    }
发布了14 篇原创文章 · 获赞 0 · 访问量 151

猜你喜欢

转载自blog.csdn.net/weixin_44580146/article/details/104392165
今日推荐