java-basic-反射

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31063463/article/details/80053936

什么是反射

在运行状态中,任何类都可以获取其属性和方法,可以调用其任意方法的属性

Class类

在class文件被加载到内存中时,内存中生成一个与class对应的Class类;class文件所有的信息与结构包含在Class类中

静态加载和动态加载

静态加载:编译时加载,new 关键字实例化对象

动态加载:运行时加载,class.newInstance() 实例化对象

获取所有字段信息

public class ClassUtil {

    private Logger logger =  Logger.getLogger(getClass());

    // ?表示不确定类型
    private Class<?> target;

    public ClassUtil(Class<?> target) {
        this.target = target;
    }

    /**
     * 获取所有字段(成员变量),名称,类型,类型名
     * @return
     */
    public void getFields(){

        this.logger.info("------------->获取所有字段");



        //获取所有的字段,不包括父类继承的字段,getFields()只能获取public修饰的字段
        Field[] fields= target.getDeclaredFields();

        this.logger.info("-------------->字段数量:"+fields.length);

        for (Field item: fields){

            System.out.print("类型:"+item.getType().getName()+"  名称:"+item.getName()+"");

            System.out.println();
        }

    }
}

获取对象方法

public class ClassUtil {

    private Logger logger =  Logger.getLogger(getClass());

    // ?表示不确定类型
    private Class<?> target;

    public ClassUtil(Class<?> target) {
        this.target = target;
    }


    public void getMethods(){

        // 获取自己声明的所有方法
        Method[] methods= this.target.getDeclaredMethods();

        for (Method var1: methods){
            // 获取所有参数
           Parameter[] parameters= var1.getParameters();
            System.out.print(var1.getReturnType().getSimpleName()+" " + var1.getName()+"(");

           if (parameters.length!=0){

               for (Parameter var2: parameters){
                   System.out.print(var2.getType().getSimpleName()+",");
               }

           }
            System.out.print(")");
            System.out.println();

        }


    }
}

获取构造函数

public class ClassUtil {

    private Logger logger =  Logger.getLogger(getClass());

    // ?表示不确定类型
    private Class<?> target;

    public ClassUtil(Class<?> target) {
        this.target = target;
    }

    public void getConstructors(){

        Constructor[] cons= this.target.getDeclaredConstructors();

        for (Constructor var: cons){

            Parameter[] parameters = var.getParameters();

            System.out.print(var.getName()+"(");

            if(parameters.length!=0){
                for (Parameter var1: parameters) {
                    System.out.print(var1.getType().getSimpleName()+",");
                }
            }
            System.out.print(")");
            System.out.println();

        }

    }
}

通过反射操作方法


public class MainTest {

    private final Logger logger = Logger.getLogger(getClass());

    private Class<?> cls = null;

    @Before
    public void before() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            this.cls = Class.forName("club.yuit.entity.Person");
            //this.cls.newInstance();
    }

    @Test
    public void methodOperation() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {

      Method method= cls.getMethod("sayHello",String.class);
      //可用Object接收返回值,没有返回值为null,有返回值返回相应的值
      method.invoke(cls.newInstance(),"你好");

    }
}

获取运行时注解

public class ClassUtil {

    private Logger logger =  Logger.getLogger(getClass());

    // ?表示不确定类型
    private Class<?> target;

    public ClassUtil(Class<?> target) {
        this.target = target;
    }

    /**
     * 获取运行时注解
     */
    public void getAnnotations(){
        Annotation[] annotations=  this.target.getAnnotations();

        for (Annotation var1: annotations) {

            Class<?> clsType = var1.annotationType();

            Method[] methods=clsType.getDeclaredMethods();

            for (Method var2: methods){
                System.out.print(var2.getReturnType().getSimpleName()+" " +var2.getName()+"(");

                Parameter[] parameters = var2.getParameters();

                if(parameters.length!=0){
                    for (Parameter var3: parameters){
                        System.out.print(var3.getName()+",");
                    }
                }

                System.out.print(")");
                System.out.println();

            }
        }
    }
}

作为平时的笔记,代码地址github

猜你喜欢

转载自blog.csdn.net/qq_31063463/article/details/80053936