一、反射机制

1.加载完类之后,会在堆中生成一个Class类型的对象,该对象包含了类的完整结构信息,通过这个对象可以得到类的结构。

二、反射相关类常用方法

Cat类在com.why文件夹下:

1
2
3
4
5
6
7
8
9
class Cat {
public name = "泡二粑";
public Cat(String name) {
this.name = name;
}
public void hi() {
Syestem.out.println("喵喵~");
}
}

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.缺点:使用反射基本是解释执行,对执行速度有影响。(优化:MethodFieldConstructor对象可以使用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
2
ClassLoader classLoader = Dog.class.getClassLoader();
Class<?> aClass3 = classLoader.loadClass("com.pra.Dog");

(且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