zoukankan      html  css  js  c++  java
  • 16_2.反射相关

    通过反射调用类的完整结

    1. 实现的全部接口
      public Class<?>[] getInterfaces()
      确定此对象所表示的类或接口实现的接口。

    2. 所继承的父类
      public Class<? Super T> getSuperclass()
      返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class。

    3. 全部的构造器

    • public Constructor[] getConstructors()
      返回此 Class 对象所表示的类的所有public构造方法。

    • public Constructor[] getDeclaredConstructors()
      返回此 Class 对象表示的类声明的所有构造方法。

    • Constructor类中:

      • 取得修饰符: public int getModifiers();
      • 取得方法名称: public String getName();
      • 取得参数的类型:public Class<?>[] getParameterTypes();

    4.全部的方法

    • public Method[] getDeclaredMethods()
      返回此Class对象所表示的类或接口的全部方法
    • public Method[] getMethods()
      返回此Class对象所表示的类或接口的public的方法
       Method run = clazz.getMethod("run");
            System.out.println(run.getReturnType());//void
    
    • Method类中:
      • public Class<?> getReturnType()取得全部的返回值
      • public Class<?>[] getParameterTypes()取得全部的参数
      • public int getModifiers()取得修饰符
      • public Class<?>[] getExceptionTypes()取得异常信息
    1. 全部的Field
    • public Field[] getFields()
      返回此Class对象所表示的类或接口的public的Field。
    • public Field[] getDeclaredFields()
      返回此Class对象所表示的类或接口的全部Field。
     Field name = clazz.getDeclaredField("name");
    
    • Field方法中:

      • public int getModifiers() 以整数形式返回此Field的修饰符

      • public Class<?> getType() 得到Field的属性类型

      • public String getName() 返回Field的名称。

    1. Annotation相关(注解)
    • get Annotation(Class annotationClass)
    • getDeclaredAnnotations()
    1. 泛型相关
    • 获取父类泛型类型:Type getGenericSuperclass()
    • 泛型类型:ParameterizedType
    • 获取实际的泛型类型参数数组:getActualTypeArguments()
    1. 类所在的包
      Package getPackage()
    package com.test;
    
    import org.junit.Test;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Arrays;
    
    import static sun.misc.PostVMInitHook.run;
    
    public class ClassTest {
        @Test
        public void newTest() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException {
            Class clazz = Class.forName("com.test.Person");
            Object person = clazz.newInstance();
            Field name = clazz.getDeclaredField("name");
            name.setAccessible(true);
            name.set(person,"lisi");
            System.out.println(person);
            //哪个类加载器加载
            System.out.println(clazz.getClassLoader());//sun.misc.Launcher$AppClassLoader@70dea4e
            System.out.println(Arrays.toString(clazz.getInterfaces()));//[interface com.test.Per]
            System.out.println(clazz.getSuperclass());//class com.test.PerC
            Method run = clazz.getMethod("run");
            System.out.println(run.getReturnType());//void
        }
    }
    interface Per{
        void run();
    }
    class PerC{
        protected String sex;
    }
    class Person extends PerC implements Per{
        private String name;
        private String sex;
    
        public Person() {
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
        @Override
        public void run() {
            System.out.println();
        }
    }
    
  • 相关阅读:
    Linux-线程同步(day14续)
    Linux之线程(day14)
    Linux-网络编程-UDP网络编程(day13续2)
    ES6 模块加载
    let与var声明区别
    vue 常用指令v-if v-else v-show v-for
    动态路由的意义,以及路由重定向
    前端路由的理解
    socpe 与 包的引入
    VUE 组件注册(全局、局部)
  • 原文地址:https://www.cnblogs.com/fly-book/p/11549172.html
Copyright © 2011-2022 走看看