java学习之反射

1.反射的基本概述

反射是一个功能强大且复杂的机制,框架设计的灵魂,一般写应用程序时不会用到,当为其他java程序员构建工具时,他的作用就能体现出来。
反射作用:

  1. 将类的各个组成部分封装成其他对象
  2. 在运行时分析类的能力
  3. 在运行时检查对象
  4. 实现泛型数组操作代码
  5. 利用Method对象

反射优点:

  1. 可以在程序运行过程中,操作这些对象
  2. 可以解耦,提高程序的可扩展性

2.Class类

2.1 Class对象获取方式

2.1.1 Class.forName(包名.类名);
        Class.forName("com.zk.fanshe.Person");
        Class.forName("java.util.Random");
2.1.2 T.class
        Class personClass = Person.class;
        Class randomClass = Random.class;
        Class aClass = int[].class;
        Class intClass = int.class;
2.1.3 对象.getClass();
        Random random = new Random();
        random.getClass();

2.2 Class类常用方法

2.2.1 获取成员变量Field

Field[ ] getFields()
getFields()方法是获取本类或父类以public修饰的成员变量

Field[] fields1 = Random.class.getFields();

Field getField(String name)
getField(String name)方法获取本类或父类指定名称的public修饰的成员变量

Class personClass = Person.class;
Field s1 = personClass.getField("s1");

Field[] getDeclaredFields()
getDeclaredFields()方法获取本类所有的成员变量

Class personClass = Person.class;
Field[] declaredFields = personClass.getDeclaredFields();

Field getDeclaredField(String name)
getDeclaredField(String name)方法获取本类指定名称的成员变量

Class personClass = Person.class;
Field sm = personClass.getDeclaredField("gj");

Field对象简单使用

  • Object get(Object obj) 获取所传递的对象所对应的成员变量的值
  • void set(Object obj, Object value) 设置所传递的对象所对应的成员变量的值
  • setAccessible(boolean flag) 忽略访问权限修饰符的安全检查,暴力反射,设置为ture时就可以对任何权限的变量进行获取和设置了
		Class personClass = Person.class;
        Field sm = personClass.getDeclaredField("gj");
        Person person = new Person();
        sm.setAccessible(true);
        sm.set(person,"ss");
        sm.get(person);
2.2.2获取构造方法Constructor

Constructor<?>[] getConstructors()
该方法获取类中所有的公开的构造方法

        Class personClass = Person.class;
        Constructor[] constructors = personClass.getConstructors();

Constructor getConstructor(Class<?>… parameterTypes)

该方法获取指定类型参数的公开的构造方法

        Class personClass = Person.class;
        Constructor constructor = personClass.getConstructor(String.class);

Constructor<?>[] getDeclaredConstructors()
该方法获取类中所有的构造方法

        Class personClass = Person.class;
        Constructor[] declaredConstructors = personClass.getDeclaredConstructors();

Constructor getDeclaredConstructor(Class<?>… parameterTypes)

该方法获取指定类型参数的构造方法

        Class personClass = Person.class;
        Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class);

Constructor对象简单使用

  • T newInstance(Object … initargs) 创建对象
  • void setAccessible(boolean flag) 忽略访问权限修饰符的安全检查
        Class personClass = Person.class;
        Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class,int.class,String.class,int.class);
        declaredConstructor.setAccessible(true);
        Object o = declaredConstructor.newInstance("11",12,"aa",15);
2.2.3 获取方法Method

Method[] getMethods()
该方法获取所有公开的方法包括父类的

        Class personClass = Person.class;
        Method[] methods = personClass.getMethods();

Method getMethod(String name, Class<?>… parameterTypes)
该方法获取指定的公开的方法包括父类的

        Class personClass = Person.class;
        Method method = personClass.getMethod("setFy", String.class);

Method[] getDeclaredMethods()
该方法获取本类所有的方法

        Class personClass = Person.class;
        Method[] declaredMethods = personClass.getDeclaredMethods();

Method getDeclaredMethod(String name, Class<?>… parameterTypes)
该方法获取本类的指定的方法

        Class personClass = Person.class;
        Method setGj = personClass.getDeclaredMethod("setGj", String.class);

Method的简单使用

  • void setAccessible(boolean flag) 忽略访问权限修饰符的安全检查
  • Object invoke(Object obj, Object… args) 执行方法
  • String getName() 获取方法名
        Class personClass = Person.class;
        Method setGj = personClass.getDeclaredMethod("setGj", String.class);
        setGj.setAccessible(true);
        Person person = new Person();
        setGj.invoke(person,"aaaa");
        String name = setGj.getName();
2.2.4 Class,Metho,Field对象共有常用方法

getAnnotation(Class annotationClass)方法
获取指定注解

<A extends Annotation> A getAnnotation(Class<A> annotationClass)
 Shi annotation = mainClass.getAnnotation(Shi.class);

isAnnotationPresent(Class<? extends Annotation> annotationClass)方法
判断是否有指定注解

boolean annotationPresent = mainClass.isAnnotationPresent(Shi.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值