欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

反射的介绍与使用

程序员文章站 2024-01-25 19:53:16
...

目录

 

一、反射

1.1什么是反射?

1.2作用

1.3反射机制的相关类

1.4Class类

1.5获得类中属性相关的方法

1.5.1获得类中相关属性的方法

1.5.2获得类中的注解相关方法

1.5.3获得类中构造器的相关方法

1.5.4获得类中方法相关的方法

1.5.5类中其他重要的方法

1.6Filed类

1.7Method类


一、反射

1.1什么是反射?

java在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

1.2作用

在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量,方法或者是属性是私有的或是只对系统应用开放,这时候就可以利用java的反射机制通过反射来获取所需的私有成员或是方法。

1.3反射机制的相关类

Class类 代表类的实体,在运行的java应用程序中表示类的接口 File 类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor 类 代表类的构造方法

1.4Class类

Class类代表类的实体,在运行的java应用程序中表示类和接口。在这个类中提供了很多有用的方法来操作一个类的实体

方法 用途

  • asSubclass(Class clazz) 把传递的类的对象转换成代表其子类的对象
  • Cast 把对象转换成代表类或是接口的对象
  • getClassLoader() 获得类的加载器
  • getClasses() 返回一个数组,数组中包含该类中所有公共类和接口类的对象 getDeclaredClasses() 返回一个数组,数组中包含该类中所有类和接口类的对象
  • forName(String className) 根据类名返回类的对象
  • getName() 获得类的完整路径名字
  • newInstance() 创建类的实例
  • getPackage() 获得类的包
  • getSimpleName() 获得类的名字
  • getSuperclass() 获得当前类继承的父类的名字 getInterfaces() 获得当前类实现的类或是接口

1.5获得类中属性相关的方法

 

1.5.1获得类中相关属性的方法

  • getFiled(String name) 获得某个共有的属性对象
  • getFileds() 获得所有公有的属性对象 (返回一个数组)
  • getDeclared() 获得某个属性对象(可以是公有的,也可以是私有的) getDeclaredFileds() 获得所有的属性对象( 返回一个数组)

1.5.2获得类中的注解相关方法

  •      getAnnotation(Class annotationClass) 返回该类中与参数类型匹配的公有注解对象
  •      getAnnotations() 返回该类中所有的注解对象
  •      getDeclaredAnnotation(ClassannotationClass) 返回该类中与参数类型匹配的所有注解对  象             
  • getDeclaredAnnotations() 返回该类中所有的注解对象

1.5.3获得类中构造器的相关方法

  • getConstructor(Calss<?>paramerterTypes) 获得该类中与参数类型相匹配的公有构造方法
  • getDeclaredConstructors() 获得该类的所有公有构造方法
  • getDeclaredConstructor(Class...<?> parameterTypes) 获得该类中与参数类型匹配的构造方法 getDeclaredConstructors() 获得该类所有构造方法

1.5.4获得类中方法相关的方法

  • getMthod(String name,Classparameter) 获得该类的某个共有方法 getMethods() 获得所有该类的公有方法
  • getDeclaredMethod(String name,ClassparameterTypes) 获得该类的某个方法 getDeclaredMethods() 获得该类的所有方法

1.5.5类中其他重要的方法

  • isAnnotation() 如果是注解类型则返回true
  • isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果是指定类型注解类型则返回true
  • isAnonymousClass() 如果是匿名类则返回true
  • isArray() 如果是一个数组类则返回true
  • isEnum() 如果是枚举类则返回true
  • isInstance(Object obj) 如果obj是该类的实例则返回true
  • isInterface() 如果是接口类则返回true
  • isLocalClass() 如果是局部类则返回true
  • isMemberClass() 如果是内部类则返回true

1.6Filed类

Field代表类的成员变量(成员变量也称为类的属性)。

方法 用途

  • equals(Object obj) 属性与obj相等则返回true
  • get(Object obj) 获得obj中对应的属性值
  • set(Object obj, Object value) 设置obj中对应属性值
class App{
    
    private static Object Integer;
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        //获得该类的Class类对象
        Class<?> aClass = Class.forName("反射.Text01");
        //通过参数类型来匹配来返回一个该类的构造类对象
        Constructor<?> constructor = aClass.getConstructor(Integer.class);
        //第一种实例化方式:通过构造类的对象来实例化该类
        Text01 o = (Text01) constructor.newInstance(3);
        //第二中实例化方式  Text01 o = (Text01) aclass..newInstance();
        //获得指定的属性(可以是公有,也可以是私有)
        Field i = aClass.getDeclaredField("i");
        //通过调用setAccessible()方法可修改该类的可见性,true代表可以修改;
        i.setAccessible(true);
        //get(Object object) 获得该属性的值
        System.out.println(i.get(o));
        //set(Object object) 设置获得属性值
        i.set(o,8);
        System.out.println(i.get(o));

    }
}

//得到类中的所有属性,返回已发个数组
class App{
    private static Object Integer;
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class<?> aClass = Class.forName("反射.Text01");
        //实例化一个类对象
        Object o = aClass.newInstance();
        //得到所有的属性返回一个Filed[]数组
        Field[] fields = aClass.getDeclaredFields();
        //遍历fields数组
        for (Field file:fields){
            //设置获得属性的可见度
            file.setAccessible(true);
            //得到属性的名称
            System.out.println(file.getName());
            if(file.getName().equals("a")){
                file.set(o,5);
            }
        }
        for (Field field:fields){
            System.out.println(field.get(o));
        }
    }
}

//结果:a
a b  c d 5 2 3 4

//结果:a a b c d 5 2 3 4

1.7Method类

 invoke(Object obj, Object... args) 传递object对象及参数调用该对象对应的方法

 

@Data
public class Text01 {
    private Integer a=1;
    private Integer b=2;
    private Integer c=3;
    private Integer d=4;
    public Text01() {
        System.out.println("构造方法");
    }

    public void show(int a){
        System.out.println("来吧,展示");
    }
    public void show1(int a){
        System.out.println("hello world");
    }

}
class App{
    private static Object Integer;
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class<?> aClass = Class.forName("反射.Text01");
        //实例化一个类对象
        Object o = aClass.newInstance();
        //得到所有的属性返回一个Method类型的数组
        Method[] methods = aClass.getDeclaredMethods();
        for (Method method:methods){
            if(method.getName().substring(0,4).equals("show"))
             method.invoke(o,3);
        }
    }
}

 

相关标签: 框架