1. 反射
反射机制:
- 将类的各个组成部分封装为其他对象
优点:
- 1.可以在程序运行的过程中,操作这些对象
- 2.可以解耦,提高程勋的可扩展性
获取Class对象的方式:
public class RefectDemo1 {
public static void main(String[] args) throws Exception {
//方式一:多用于配置文件,将类名定义在配置文件中,读取文件,加载类
Class cls1 = Class.forName("com.huihui.reflect.User");
//方式二:多用于参数的传递
Class cls2 = User.class;
//方式三:多用于对象的获取字节码的方式
User user = new User();
Class cls3 = user.getClass();
//同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次
System.out.println(cls1 == cls2);//true
System.out.println(cls1 == cls3);//true
}
}
2. Class的获取功能
2.1 获取字段
- Field[] getFields() 获取public成员属性
- Field getField(String name) 获取指定名称的public的成员属性
- Field[] getDeclaredFields() 获取全部的成员属性
- Field getDeclaredField(String name) 获取指定名称的成员属性
Class<User> cls = User.class;
Field[] fields = cls.getFields();
for (Field field : fields) {
System.out.println(field);
}
Field[] declaredFields = cls.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
获取字段之后的处理:
- set(Object obj,Object value) 设置值
- get(Object obj) 获取值
- setAccessible() 忽略访问权限修饰符的安全检查,也叫暴力反射
User user = new User();
Field b = cls.getDeclaredField("b");
//忽略访问权限修饰符的安全检查
b.setAccessible(true);
Object value1 = b.get(user);
System.out.println(value1);
b.set(user,2);
Object value2 = b.get(user);
System.out.println(value2);
2.2 获取构造方法并创建对象
- Constructor<?>[] getConstructors()
- Constructor getConstructor(类<?>… parameterTypes)
- Constructor getDeclaredConstructor(类<?>… parameterTypes)
- Constructor<?>[] getDeclaredConstructors()
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
Class<User> c = User.class;
//获取User的有参构造方法
Constructor<User> constructor = c.getConstructor(String.class, int.class);
//创建对象
User user = constructor.newInstance("zhangsan", 17);
System.out.println(user);
//获取User的无参构造方法
Constructor<User> constructor1 = c.getConstructor();
User user1 = constructor1.newInstance();
System.out.println(user1.hashCode());
//Class提供了一种简单的无参创建对象
User user2 = c.newInstance();
System.out.println(user2.hashCode());
}
}
2.3 获取方法并执行
- 方法[] getMethods()
- 方法 getMethod(String name, 类<?>… parameterTypes)
- 方法[] getDeclaredMethods()
- 方法 getDeclaredMethod(String name, 类<?>… parameterTypes)
public class ReflectDemo4 {
public static void main(String[] args) throws Exception {
Class<User> c = User.class;
//获取方法
Method eat = c.getMethod("eat", String.class);
//执行方法
eat.invoke(new User(), "hehe");
}
}