定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
用途
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。
常见应用场景:
自定义注解,通过自定义注解添加权限、日志等功能
注意:反射要少用,因为反射破环了封装,效率比较低。
=================================================================
一、先创建一个model类,便于测试
package com.sh.demo.model; import lombok.Data; import org.springframework.stereotype.Repository; @Data @Repository public class User { public User() { } private int id; private String name; public String pubVal; private User(String pubVal){ this.pubVal=pubVal; } public User(String pubVal,String name){ this.pubVal=pubVal; } private String method(String str){ System.out.println(str); return str; } }
二、获得Class方式
Class aClass = new User().getClass(); aClass = Class.forName("com.sh.demo.model.User"); aClass=ClassLoader.getSystemClassLoader().loadClass("com.sh.demo.model.User");
三、获得属性
Field[] fields = aClass.getFields();//获得对象中所有public的属性 Field[] declaredFields = aClass.getDeclaredFields();//获得对象中所有属性 Field id = aClass.getField("pubVal");//获得对象中指定public的属性
四、获得方法
Method[] methods = aClass.getMethods();//获得对象中所有public的方法 Method[] declaredMethods = aClass.getDeclaredMethods();//获得对象中所有的方法 Method setId = aClass.getMethod("setId", int.class);//获得对象中指定public的方法
五、获得构造函数
Constructor<?>[] constructors = aClass.getConstructors();//获得对象中所有public的构造函数 Constructor<?>[] constructors_all = aClass.getDeclaredConstructors();//获得对象中所有的构造函数 Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);//获得private的对应参数的构造函数 Constructor<?> constructor = aClass.getConstructor(String.class,String.class);//获得public的对应参数的构造函数
六、Class常用方法
aClass = Class.forName("com.sh.demo.controller.People"); Class superclass = aClass.getSuperclass();//获得当前类继承的父类的名字 Class[] interfaces = aClass.getInterfaces();//获得当前类实现的类或是接口
七、获得方法上的注解
for (Method declaredMethod : declaredMethods) { Annotation[] declaredAnnotations = declaredMethod.getAnnotations();//获得所有public方法上的注解 Bean annotation = declaredMethod.getAnnotation(Bean.class);//获得指定方法上的指定注解 }
八、执行方法
Method method = aClass.getMethod("method", String.class);//获得类中方法
Object obj = aClass.newInstance();//根据传递的参数创建类的对象
method.setAccessible(false);//设置false就可以调用private的方法,否则只能调用public的,设置false反射效率能提高3-4倍
String str = (String) method.invoke(obj, "strtest");//执行方法