反射常用操作

定义

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");//执行方法

附我工作中使用过的自定义注解

参考资料

 

posted @ 2020-05-19 22:18  RollBack2010  阅读(190)  评论(0编辑  收藏  举报