IT评测·应用市场-qidao123.com

标题: Java笔记(17) 反射 [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 2023-4-17 14:27
标题: Java笔记(17) 反射
需求:
根据配置文件 re.properties 中指定的信息,创建对象,并调用方法
classfullpath=com.hiibird.Cat
method=hi
使用现有技术能做到吗?
  1. //首先读取配置文件
  2. Properties properties = new Properties();
  3. File file = new File("./Reflection/src/re.properties");
  4. properties.load(new FileReader(file));
  5. //可以获得类名和包路径,以及方法名,但现有方法无法利用这些信息重构该类或者调用方法
  6. String classFullPath = properties.getProperty("classfullpath");
  7. String methodName = properties.getProperty("method");
  8. //new classFullPath(); //使用传统方法无法利用String类型的报名创建类
  9. //使用反射机制
  10. //1. 加载类,返回Class类型的对象
  11. Class<?> clazz = Class.forName(classFullPath);
  12. System.out.println(clazz);
  13. //2. 通过aClass 的到加载的类 com.hiibird.Cat 的对象实例
  14. Object o = clazz.getDeclaredConstructor().newInstance();
  15. System.out.println("o的运行类型:" + o.getClass());//o的运行时类型还是com.hiibird.Cat
  16. //3. 通过getMethod()方法得到加载的类 com.hiibird.Cat 的methodName "hi" 的方法对象
  17. //即:在反射中,可以把方法视为对象(万物皆对象)
  18. Method method = clazz.getMethod(methodName);
  19. //4. 调用:通过method 调用方法:即通过方法对象来实现调用方法
  20. method.invoke(o);   //传统方法 对象.方法();反射机制:方法.invoke(对象)
复制代码
这样的需求在学习框架时特别多,即通过外部配置文件,在不修改源码的情况下来控制程序,也符合设计模式的ocp原则(开闭原则:不修改源码,扩容功能)
1. 反射机制

1.1 Java反射机制的作用及优缺点

反射机制的优缺点:优点:可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑;缺点:使用反射基本是解释执行,对执行速度有影响
1.2 反射相关的主要类

  1. Class<?> clazz = Class.forname(classfullpath);
  2. Object instance = clazz.getDeclaredConstructor().newInstance();
复制代码
  1. //传统写法:instance.method(),反射:method.invoke(instance);
  2. Method method = clazz.getMethod(methodName);
  3. method.invoke(instance);
复制代码
  1. //传统写法:instance.field,反射:field.get(instance)
  2. Field field = clazz.getField(fieldName);
  3. System.out.println(nameField.get(instance));
复制代码
  1. Constructor<?> constructor = clazz.getConstructor();//返回无参构造器
  2. //通过指定构造器参数类型,获取有参构造器
  3. Constructor constructor1 = clazz.getConstructor(String.class, Integer.class);
复制代码
1.3 反射调用优化-关闭访问检查

  1. method.setAccessible(true);//在反射调用时取消访问检查,可以稍微提高性能
  2. method.invoke(instance);
复制代码
2. Class类

类定义:
  1. public final class Class<T> implements java.io.Serializable,
  2.                                 GenericDeclaration,
  3.                                 Type,
  4.                                 AnnotatedElement
复制代码
基本介绍
2.1 Class类的常用方法

方法名功能说明static Class forName(String name)返回指定类名name的Class对象Object getConstructor().newInstance()调用缺省构造函数,返回该Class对象的一个实例getName()返回此Class对象所表示的实体(类、接口、数组类、基本类型等)名称class getSuperclass()返回当前Class对象的超类的Class对象Class[] getInterface()返回当前Class对象的接口ClassLoader getClassLoader()返回该类的类加载器Constructor[] getConstructors()返回一个包含某些Constructor对象的数组Field[] getDeclaredFields()返回Field对象的一个数组Method getMethod(String name, Class ... paramType)返回一个Method对象,此对象的形参为paramType2.2 获取Class对象的6中方式

  1. Class clazz = Class.forName("java.lang.Cat");
复制代码
  1. Class<Cat> clazz = Cat.class;
  2. //用来传递参数
  3. Constructor constructor = clazz.getConstructor(String.class, Integer.class);
复制代码
  1. Class<> clazz = instance.getClass();
复制代码
  1. ClassLoader cl = instance.getClass().getClassLoader();
  2. Class clazz = cl.loadClass("classFullPath");
复制代码
  1. Class<Integer> clazz = int.class;
复制代码
  1. Class<Integer> clazz = Integer.TYPE;
复制代码
2.3 哪些类型有Class对象

2.3 通过反射获取类的结构信息

java.lang.Class类
java.lang.reflect.Field类
java.lang.reflect.Method类
java.lang.reflect.Constructor类
2.4. 通过反射创建对象

2.5 通过反射访问类中的成员

2.6 通过反射访问类中的方法

3 类加载

基本说明:反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载。
3.1 类加载时机

3.2 类的加载过程



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4