目录:
1.什么是反射
2.获取Class反射类的方式
3.通过反射类获取对应的类对象
4.通过反射类获取属性类对象
4.1Field (属性) 类中常见的方法
5.获取方法类对象
5.1Method(方法)类中常见的方法
6.获取Constructor(构造)对象
技术细节:
1.什么是反射
反射它是框架设计的灵魂。
框架: 它就是一个半成品,客户可以引入该框架,在框架的基础上填写自己的业务代码。提高开发效率。 比如: springmvc mybatis框架 。
2.获取Class反射类的方式
获取Class反射类有三种方式:
第一种:Class.forName("类的全路径")
<bean id="s" class="com.aaa.Student"> app.getBean("s");
第二种: 类.class
Mybatis----session.getMapper(StudentDao.class)
第三种: 对象名.getClass();
代码演示:
package demo01;
//获取Class反射类有三种方式:
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//第一种,通过路径获取
Class <?> aClass = Class.forName("demo01.Student");
//第二种.通过类名获取
Class<Student> aClass1 = Student.class;
//第三种,通过对象获取
Student s = new Student();
Class<? extends Student> aClass2 = s.getClass();
//这三个对象的引用地址相同
System.out.println(aClass==aClass1);
System.out.println(aClass==aClass2);
System.out.println(aClass1==aClass2);
}
}
class Student{
String name;
private String sex;
public String address;
public void show(){
System.out.println("!!!!!!!!!!!show!!!!!!!!");
}
}
3.通过反射类获取对应的类对象
语法:
反射对象.newInstance();
代码演示:
package demo02;
//通过反射获取反射类对象
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//获取反射类
Class<Student> aClass1 = Student.class;
//获取反射类对象 o和o1的地址不相同
Student o = aClass1.newInstance();
Student o1 = aClass1.newInstance();
System.out.println(o);
System.out.println(o1);
}
}
class Student{
String name;
private String sex;
public String address;
public Student() {
}
public Student(String name, String sex, String address) {
this.name = name;
this.sex = sex;
this.address = address;
}
public void show(){
System.out.println("!!!!!!!!!!!show!!!!!!!!");
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return sex
*/
public String getSex() {
return sex;
}
/**
* 设置
* @param sex
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* 获取
* @return address
*/
public String getAddress() {
return address;
}
/**
* 设置
* @param address
*/
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return "Student{name = " + name + ", sex = " + sex + ", address = " + address + "}";
}
}
4.通过反射类获取属性类对象
代码演示:
package demo03;
import java.lang.reflect.Field;
//通过反射获取反射类对象
public class Test {
public static void main(String[] args) throws Exception {
//获取反射类对象
Class<Student> aClass = Student.class;
//通过反射类对象获取本类中指定(指定sex)的属性对象;他获取不了父类中的属性对象
Field sexField = aClass.getDeclaredField("sex");
System.out.println(sexField);
//获取本类中的所有属性对象
Field[] declaredFields = aClass.getDeclaredFields();
for (Field f : declaredFields){
System.out.println(f);
}
//获取本类或父类中所有public属性对象
//一起拿
Field[] fields = aClass.getFields();
for (Field f : fields){
System.out.println(f);
}
//单个拿
Field address = aClass.getField("address");
System.out.println(address);
Field phone = aClass.getField("phone");
System.out.println(phone);
}
}
class People{
public String phone;
}
class Student extends People{
String name;
private String sex;
public String address;
public Student() {
}
public Student(String name, String sex, String address) {
this.name = name;
this.sex = sex;
this.address = address;
}
public void show(){
System.out.println("!!!!!!!!!!!show!!!!!!!!");
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return sex
*/
public String getSex() {
return sex;
}
/**
* 设置
* @param sex
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* 获取
* @return address
*/
public String getAddress() {
return address;
}
/**
* 设置
* @param address
*/
public void setAddress(String address) {
this.address = address;
}
public String toString() {
return "Student{name = " + name + ", sex = " + sex + ", address = " + address + "}";
}
}
4.1Field(属性)类中常见的方法
语法:
setAccessible(true); //设置私有访问权限
set(o,value);
代码演示:
package demo04;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
//获取反射类
Class<Son> sonClass = Son.class;
//获取反射类中的属性对象
Field nameField = sonClass.getDeclaredField("name");
//获取属性对象的修饰符;返回值是int类型。对应修饰符的值
int modifiers = nameField.getModifiers();
System.out.println(modifiers);
//获取反射类对象
Son son = sonClass.newInstance();
//打印结果反射类对象的属性没有值
System.out.println(son);
//因为属性nameField属性对象,对应的属性name是私有的,所以用反射打破封装性
nameField.setAccessible(true);
//给son中的nameField 属性赋值
nameField.set(son,"刘德华");//name 参数类型是String所以加引号
System.out.println(son);
}
}
class Son{
private String name;
public int age;
public Son() {
}
public Son(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Son{name = " + name + ", age = " + age + "}";
}
}
5.获取方法类对象
getMethods():获取本类以及父类中所有public的方法对象
getMethod(name,Class...):根据方法名获取对应的方法对象
getDeclaredMethods();得到本类中所有方法对象
getDeclaredMethod(name,Class 参数的类型)
5.1Method(方法)类中常见的方法
语法:
*Object invoke(Object o,Object... values)
* Object o = show.invoke(son, 18, "hello");//执行该方法
System.out.println(o);
5跟5.1合并代码演示:
package demo05;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
//获取反射类
Class<Son> sonClass = Son.class;
//获取反射类对象
Son son = sonClass.newInstance();
//根据方法名获取方法对象;int.class为参数;为什么要写.class因为底层要的是class类型
Method show = sonClass.getMethod("show",int.class);
//执行son类对象的show方法;18为int.class参数赋值为18
show.invoke(son,18);
}
}
class Son{
public void show(int a){
System.out.println("~~~~~~show~~~~~~~~"+ a);
}
}
6.获取Constructor(构造)对象
代码演示:
package demo06;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
//获取反射类
Class<?> aClass = Class.forName("demo06.Son");
//不传参数,获取的是无参构造方法对象
Constructor<?> constructor = aClass.getConstructor();
//通过无参构造对象获取son对象(也叫实例对象)
Object o = constructor.newInstance();
System.out.println(o);
//获取有参的构造对象
Constructor<?> constructor1 = aClass.getConstructor(String.class, int.class);
//通过有参构造对象获取son对象
Object o1 = constructor1.newInstance("张三", 18);
System.out.println(o1);
}
}
class Son{
private String name;
public int age;
public void show(int a){
System.out.println("~~~~~~show~~~~~~~~"+ a);
}
public Son() {
}
public Son(String name) {
this.name = name;
}
public Son(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Son{name = " + name + ", age = " + age + "}";
}
}
总结:
反射: [1]获取反射类的方式 [2]获取属性对象Field [3]获取方法对象 [4]构造对象