框架基础:反射
目录
框架设计的灵魂
一:概念
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1. 可以在程序运行过程中,操作这些对象。
2. 可以解耦,提高程序的可扩展性。
二:获取Class对象的方式
(一)Class.forName("全类名"):
将字节码文件加载进内存,返回Class对象
* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
* 全类名=包名+类名
(二)类名.class:
通过类名的属性class获取
* 多用于参数的传递
(三)对象.getClass():
getClass()方法在Object类中定义着。
* 多用于对象的获取字节码的方式
public class Stduent {
String name;
int age;
}
public class StudentText {
public static void main(String[] args) throws ClassNotFoundException {
//Class.forName("全类名")
Class s=Class.forName("MyClass.框架基础.Stduent");
System.out.println(s);
//类名.class
Class s1 =Stduent.class;
System.out.println(s1);
//对象.getClass()
Stduent std =new Stduent();
Class s2 = std.getClass();
System.out.println(s2);
}
}
三:Class对象功能
(一)获取功能
获取成员变量们
- Field[] getFields() :获取所有public修饰的成员变量
- Field getField(String name) : 获取指定名称的 public修饰的成员变量
- Field[] getDeclaredFields() :获取所有的成员变量,不考虑修饰符
- Field getDeclaredField(String name)
获取构造方法们
- Constructor<?>[] getConstructors() :获取所有public修饰的成员方法
- Constructor<T> getConstructor(类<?>... parameterTypes)
- Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) :获取所有的方法变量,不考虑修饰符
- Constructor<?>[] getDeclaredConstructors()
获取成员方法们:
- Method[] getMethods()
- Method getMethod(String name, 类<?>... parameterTypes) :方法名称,可变参数的class
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name, 类<?>... parameterTypes)
获取全类名
- String getName()
(二)Field:成员变量
设置值
- void set(Object obj, Object value) :对象,数值
获取值
- get(Object obj):对象
忽略访问权限修饰符的安全检查
- setAccessible(true):暴力反射
public class StudentText {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Stduent st =new Stduent();
//获取Class对象
Class aClass = st.getClass();
Field[] fields = aClass.getFields();
for(Field field :fields){
System.out.println(field);
}
System.out.println("---------------------------");
System.out.println(aClass.getField("age"));
System.out.println("++++++++++++++++++++++++++++");
Field scoreField = aClass.getDeclaredField("score");//private int score;
//暴力反射
scoreField.setAccessible(true);
//设置值
scoreField.set(st,88);
//获取值
System.out.println(scoreField.get(st));
}
}
(三)Constructor:构造方法
创建对象:
- T newInstance(Object... initargs)
- 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
忽略访问权限修饰符的安全检查
- setAccessible(true):暴力反射
public class StudentText {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Stduent st =new Stduent();
Class<? extends Stduent> aClass = st.getClass();
Constructor<? extends Stduent> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, int.class);
Stduent sshyes = declaredConstructor.newInstance("sshyes", 18, 99);
System.out.println(sshyes);
}
}
(四)Method:方法对象
执行方法:
- Object invoke(Object obj, Object... args) :对象,参数列表
获取方法名称:
- String getName:获取方法名
public class StudentText {
public static void main(String[] args) {
Stduent st =new Stduent();
Class<? extends Stduent> aClass = st.getClass();
try {
Method eatStudent = aClass.getMethod("eat",String.class); //方法名,参数的class列表
Object st1 = eatStudent.invoke(st,"饭"); //对象名,参数的名称
System.out.println(st1);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Method[] methods = aClass.getMethods();
for(Method method:methods){
System.out.println(method);
String nameMethod;
nameMethod=method.getName(); //获取方法名
System.out.println(nameMethod);
}
System.out.println("--------------------");
//获取全类名
String className=aClass.getName();
System.out.println(className);
}
}
四:案例
需求:
- 写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
实现:
1. 配置文件
2. 反射
步骤:
1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2. 在程序中加载读取配置文件
3. 使用反射技术来加载类文件进内存
4. 创建对象
5. 执行方法
????(等java的基础复习完,在写)
本文地址:https://blog.csdn.net/weixin_44359595/article/details/109655917
上一篇: 主板坏了怎么办 通用主板自救大法
下一篇: 白给便宜谁不要 主板“破解门”逐个点评