java reflection 基础学习笔记
一、反射机制
1.加载完类之后,会在堆中生成一个Class类型的对象,该对象包含了类的完整结构信息,通过这个对象可以得到类的结构。
二、反射相关类常用方法
Cat类在com.why文件夹下:
1 | class Cat { |
1.通过字符串获得Cat类的Class类型对象:Class aClass = Class.forName("com.why.Cat");
2.通过获得的Class类型对象创建一个Cat类型对象:Cat o = (Cat)aClass.newInstance();
3.通过Class类型对象获得public
修饰的方法hi的Method对象:Method hi = aClass.getMethod("hi");
4.调用hi方法:hi.invoke(o);
5.通过Class类型对象获得public
修饰的属性name的Field对象:Field fieldName = aClass.getField("name");
6.获取对象o的属性name:fieldName.get(o)
7.修改对象o的属性name为咪咪:fieldName.set(o, "咪咪")
7.通过Class类型对象获得public
修饰的有参构造器(无参类似):Constructor construtct = aClass.getConstructor(String.class);
8.通过Class类型对象获取该对象属性的Field数组: Field[] fields = aClass.getFields();
三、反射机制的优缺点
1.优点:可以动态地创建和使用对象,使用灵活,没有反射机制,框架技术就失去底层支撑。
2.缺点:使用反射基本是解释执行,对执行速度有影响。(优化:Method
、Field
和Constructor
对象可以使用setAccessible()
方法设置参数值为true
,已取消访问检查,但是优化效果并不够理想)
###四、Class类
(1)获取Class对象的六种方法
Dog类在com.why文件夹下
1 | class Dog {} |
1.通过Class.forName()方法。(多用于读取配置文件)
例:Class<?> aClass = Class.forName("com.why.Dog");
2.通过 类名.class 方式获取。(多用于传递参数)
例:Class<Dog> aClass1 = Dog.class
3.通过已创建的对象获得。
例:Dog dog = new Dog();
`Class<? extends Dog> aClass2 = dog.getClass();`
4.通过创建ClassLoader对象来获取。
例:
1 | ClassLoader classLoader = Dog.class.getClassLoader(); |
(且aclass ~ aclass3四个对象均为同一对象)
5.基本数据通过 基本数据类型.class 获取Class对象。
例:Class<Integer> integerClass = int.class;
6.基本数据类型的包装类,通过包装类.TYPE 获取Class对象。
例:Class<Integer> intClass = Integer.TYPE;
(2)有class对象的类
1.外部类,成员内部类,静态内部类,局部内部类,匿名内部类。
2.interface。
3.数组。
4.enum:枚举
5.annotation:注解
6.基本数据类型
7.void
(3)Class类的常用方法
Class cls = Class.forName("com.pra.Dog");
1.获取全类名:String name = cls.getName();
2.获取简单类名:String simpleName = cls.getSimpleName();
3.获取所有public
修饰属性的Field对象,包含本类及其父类:Field[] fields = cls.getFields();
4.获取本类所有的属性的Field对象:Field[] fields = cls.getDeclaredFields();
5.获取所有public
修饰的方法的Method对象,包含本类及父类:Method[] methods = cls.getMethods();
6.获取本类中所有的方法的Method对象:Methods[] methods = cls.getDeclaredMethods();
7.获取所有public
修饰的构造器的Constructor对象,不包含本类及父类:Constructor[] constructors = cls.getConstructors();
8.获取本类的所有构造器的Constructor对象:Constructor[] constructors = cls.getDeclaredConstructor();
9.返回类所在包的信息:Package aPackage = cls.getPackage();
10.返回类的直接父类的Class对象:Class aClass = cls.getSuperclass();
11.返回类实现的所有接口的Class对象:Class<?>[] interfaces = cls.getInterfaces();
12.返回类所有的注解信息的Annotation对象:Annotation[] annotations = cls.getAnnotations();
###学习的视频资料 0710_韩顺平Java_反射机制问题_哔哩哔哩_bilibili