Java反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单的说:一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。
Java反射机制主要提供了以下功能:
-
在运行时判断任意一个对象所属的类;
-
在运行时构造任意一个类的对象;
-
在运行时判断任意一个类所具有的成员变量和方法;
-
在运行时调用任意一个对象的方法;生成动态代理
反射的API介绍
简述:我们写的所有的类,都会被appclassloader加载到内存的方法区,生成一个Class类型的对象,他们即是你写的class,又是Class的实例,也叫说明书的说明书。
Java反射的类主要有java.lang.Class类和java.lang.reflect包中的Filed、Consturctor、Method、Annotation类
示例实体类User
Class User(){
public String name;
private int age;
public void login(){
System.out.println("login...")
}
public void login(String username){
System.out.println(username + " login...")
}
public void login(String username, String password){
System.out.println(username + " login...," + "password is " + password)
}
}
-
获取类对象的方法
// 1、使用类
Class clazz = User.class;
// 2、使用类全名
Class clazz = Class.forName("com.jarreet.pojo.User");
// 3、使用对象
User user = new User();
Class clazz = user.getClass(); -
对类对象进行操作
// 获取类名字
String name = clazz.getName();
// 获取类加载器
ClassLoader classLoader = clazz.getClassLoader();
// 获取资源
URL resource = claszz.getResource("");
// 获取资源流
InputStream resourceAsStream = clazz.getResourceAsStream("");
// 得到父类
Class superclass = clazz.getSuperclass();
// 判断一个类是不是接口,数组等等
boolean array = clazz.isArray();
boolean anInterface = clazz.isInterface();
// 重点:使用class对象实例化一个对象
Object instance = clazz.newInstance(); -
将字段并操作
-
获取字段
// 获取字段,只能获取公共的字段(public)
Field name = clazz.getField("name");
Fidle[] fields = claszz.getFields();
// 能获取所欲字段
Field age = clazz.getDeclaredField("age");
Field[] declaredFields = clazz.getDeclaredFields(); -
获取对象的属性
User user = new User();
user.setAge("18");
Class clazz = User.class;
Field age = clazz.getDeclaredField("age");
System.out.println(age.get(user)); -
设置对象的属性
User user = new User();
user.setName("Jarreet");
Class clazz = User.class;
Field age = clazz.getDeclaredField("age");
age.set(user,"18");
System.out.println(age.get(user));// 暴力注入
Field age = dogClass.getDeclaredField("age");
//暴力注入
age.setAccessible(true);
age.set(user,"20");
-
-
方法
-
获取方法
// 根据名字和参数类型获取一个方法
Method method = clazz.getMethod("login", String.class);
Method[] methods = clazz.getMethods();
Method declaredMethod = clazz.getDeclaredMethod("login", String.class);
Method[] declaredMethods = clazz.getDeclaredMethods(); -
对方法的操作
User user = new User();
user.setAge("18");
Class clazz = User.class;
// 读取某个方法,名字,后边是参数类型
Method method = clazz.getMethod("login", String.class);
// 拿到参数个数
int parameterCount = method.getParameterCoun();
// 拿到方法的名字
String name = method.getName();
// 拿到参数的类型数组
Class<?>[] parameterTypes = method.getParameterTypes();
// 拿到返回值类型
Class<?> returnType = method.getReturnType();
// 重点:反射调用方法,传一个实例和参数
method.invoke(user,"Jarreet558")Class userClass = Class.forName("com.jarreet.pojo.User");
Object user = userClass.newInstance();
Method login = userClass.getMethod("login");
login.invoke(user);
Method login2 = userClass.getMethod("login", String.class);
login.invoke(user, "Jarreet558");
Method login3 = userClass.getMethod("login", String.class, String.class);
login.invoke(user, "Jarreet558", "123456");
-
-
构造函数
-
获取并构建对象
Constructor[] constructors = clazz.getConstructors();
Constructor constructor = clazz.getConstructor();
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
Constructor declaredConstructor = clazz.getDeclaredConstructor();
Object obj = constructor.newInstance();
-
-
注解
-
从方法、字段、类上获取注解
//元注解 要加上runtime
//类上
Annotation annotation = clazz.getAnnotation(Bean.class);
Annotation[] annotations = clazz.getAnnotations();
//字段上
Annotation annotation = field.getAnnotation(Bean.class);
Annotation[] annotations = field.getAnnotations();
//方法上
Annotation annotation = method.getAnnotation(Bean.class);
Annotation[] annotations = method.getAnnotations();
-

浙公网安备 33010602011771号