Java中反射:框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1. 可以在程序运行过程中,操作这些对象。
2. 可以解耦,提高程序的可扩展性。
1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2. 类名.class:通过类名的属性class获取
* 多用于参数的传递
3. 对象.getClass():getClass()方法在Object类中定义着。
* 多用于对象的获取字节码的方式
深入理解java中==和equals的用法
* ==号比较两个对象时比较的是两个对象的地址值
*String 这个类重写了equals这个方法,所以比较的是两个对象的值
public static void main(String[] args) throws Exception {
// 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
Class cla = Class.forName("com.entity.Students");
System.out.println(cla);
// 2. 类名.class:通过类名的属性class获取
Class cla1 = Students.class;
System.out.println(cla1);
//3. 对象.getClass():getClass()方法在Object类中定义着。
Students students = new Students();
Class cla2 = students.getClass();
System.out.println(cla2);
System.out.println(cla==cla1);
}
结果打印:
class com.entity.Students
class com.entity.Students
class com.entity.Students
true
1. 获取成员变量们
1. 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
package com.song;
import com.entity.Students;
import java.lang.reflect.Field;
/**
* @author SongXianYang
* @date 2020-07-23 11:10:29
**/
public class MyClass1 {
/*
获取功能:
1. 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
*/
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Class sc = Students.class;
Field[] fields = sc.getFields();
for (Field field : fields) {
System.out.println(field);
}
Students students = new Students();
Field a = sc.getField("a");
Object o = a.get(students);
System.out.println(o);
a.set(students,"花花大世界");
System.out.println(students);
System.out.println("----------------------");
Field[] declaredFields = sc.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("-----------------");
Field a1 = sc.getDeclaredField("b");
a1.setAccessible(true);
Object o1 = a1.get(students);
System.out.println(o1);
a1.set(students, "HelloSong");
System.out.println(students);
}
}
打印结果为:
rget\classes" com.song.MyClass1
public java.lang.String com.entity.Students.a
null
Students{name='null', age=0, a='花花大世界', b='null'}
----------------------
private java.lang.String com.entity.Students.name
private int com.entity.Students.age
public java.lang.String com.entity.Students.a
private java.lang.String com.entity.Students.b
-----------------
null
Students{name='null', age=0, a='花花大世界', b='HelloSong'}
Field:成员变量
* 操作:
1. 设置值
* void set(Object obj, Object value)
2. 获取值
* get(Object obj)
3. 忽略访问权限修饰符的安全检查
* setAccessible(true):暴力反射
遍历快捷键:
iter
2. 获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
public class MyClass2 {
/*
2. 获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
*/
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class sc = Students.class;
//有参构造
Constructor constructor = sc.getConstructor(String.class, int.class);
System.out.println(constructor);
Object song = constructor.newInstance("song", 12);
System.out.println(song);
//无参构造
Object o = sc.newInstance();
System.out.println(o);
}
结果打印;
public com.entity.Students(java.lang.String,int)
Students{name='song', age=12, a='null', b='null'}
Students{name='null', age=0, a='null', b='null'}
* Constructor:构造方法
* 创建对象:
* T newInstance(Object... initargs)
* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
3.获取成员方法们与获取全类名
获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name, 类<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
* 获取全类名
* String getName()
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class sc = Students.class;
Method eatMethods = sc.getDeclaredMethod("eat");
Students s = new Students();
eatMethods.invoke(s);
System.out.println("------------------------");
Method eatMethods1 = sc.getDeclaredMethod("eat",String.class);
eatMethods1.invoke(s,"冰激凌");
//获取方法名
String name = eatMethods1.getName();
System.out.println(name);
//获取全类名
//String getName()
String name1 = sc.getName();
System.out.println(name1);
}
结果打印:
喜欢吃-->
------------------------
喜欢吃-->冰激凌
eat
com.entity.Students
* Method:方法对象
* 执行方法:
* Object invoke(Object obj, Object... args)
* 获取方法名称:
* String getName:获取方法名
Students
public class Students {
private String name;
private int age;
public String a;
private String b;
public Students() {
}
public Students(String name, int age) {
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;
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
'}';
}
public void eat() {
System.out.println("喜欢吃-->");
}
public void eat(String pool) {
System.out.println("喜欢吃-->"+pool);
}
}
希望可以帮助到大家,有不对的地方望指正。谢谢