0
点赞
收藏
分享

微信扫一扫

反射技术学习笔记

云竹文斋 2022-01-22 阅读 75

反射技术学习笔记

文章目录


一、反射介绍

1.什么是反射

Java 反射机制是 Java 语言一个很重要的特性,它使得 Java 具有了“动态性”。在 Java
程序运行时,对于任意的一个类,我们能不能知道这个类有哪些属性和方法呢?对于任意的
一个对象,我们又能不能调用它任意的方法?答案是肯定的!这种动态获取类的信息以及动
态调用对象方法的功能就来自于 Java 语言的反射(Reflection)机制。

2.反射的作用

简单来说两个作用,RTTI(运行时类型识别)和 DC(动态创建)。
我们知道反射机制允许程序在运行时取得任何一个已知名称的 class 的内部信息,包括
其 modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变 fields 内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!

二、创建对象过程

1.创建 Java 对象的三个阶段

在这里插入图片描述

2.创建对象时内存结构

在这里插入图片描述
实际上,我们在加载任何一个类时都会在方法区中建立“这个类对应的 Class 对象”,
由于“Class 对象”包含了这个类的整个结构信息,所以我们可以通过这个“Class 对象”
来操作这个类。
我们要使用一个类,首先要加载类;加载完类之后,在堆内存中,就产生了一个 Class 类
型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可
以通过这个对象知道类的结构。这个对象就像一面镜子,透过这个镜子可以看到类的结构,
所以,我们形象的称之为:反射。 因此,“Class 对象”是反射机制的核心。

三、获取Class对象的三种方式

首先,创建Users类

public class Users {
    private String username;
    private int userage;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getUserage() {
        return userage;
    }

    public void setUserage(int userage) {
        this.userage = userage;
    }
}

1.通过getClass()方法获取Class对象

//获取Class对象的三种方式_getClass()方法
public class GetClass1 {
    public static void main(String[] args) {
        Users users = new Users();
        Class clazz = users.getClass();
        Class clazz2 = users.getClass();
        System.out.println(clazz);
        System.out.println(clazz.getName());
        System.out.println(clazz == clazz2);
    }
}

2.通过.class静态属性获取Class对象

//通过.class静态属性获取Class对象
public class GetClass2 {
    public static void main(String[] args) {
        Class clazz = Users.class;
        Class clazz2 = Users.class;
        System.out.println(clazz);
        System.out.println(clazz.getName());
        System.out.println(clazz == clazz2);
    }
}

3.通过Class.forName(“class Name”)方法获取Class对象

在这里插入图片描述

//通过Class.forName("class Name")获取Class对象
public class GetClass3 {
    public static void main(String[] args) throws Exception{
        Class clazz = Class.forName("Reflection.Users");
        Class clazz2 = Class.forName("Reflection.Users");
        System.out.println(clazz);
        System.out.println(clazz.getName());
        System.out.println(clazz == clazz2);
    }
}

四、获取类的构造方法

1.方法说明及使用

在这里插入图片描述

//获取类的构造方法_方法说明及使用
public class GetConstructor {
    public static void main(String[] args) throws Exception{
        Class clazz = Users.class;
        Constructor[] arr = clazz.getDeclaredConstructors();
        for (Constructor c:arr){
            System.out.println(c);
        }

        System.out.println("---------------------------------");
        Constructor[] arr1 = clazz.getConstructors();
        for (Constructor c:arr1){
            System.out.println(c);
        }

        System.out.println("----------------------------------");
        Constructor c = clazz.getDeclaredConstructor(int.class);
        System.out.println(c);

        System.out.println("===============================");
        Constructor c1 = clazz.getConstructor(null);
        System.out.println(c1);
    }
}

2.通过构造方法创建对象

在这里插入图片描述

//通过构造方法创建对象__constructor.newInstance()方法
public class GetConstructor2 {
    public static void main(String[] args) throws Exception{
        Class clazz = Users.class;
        Constructor constructor = clazz.getConstructor(String.class,int.class);
        Object o = constructor.newInstance("Corey",18);
        Users users = (Users)o;
        System.out.println(users.getUsername()+"\t"+users.getUserage());
    }
}

五、获取类的成员变量

1.方法说明及使用

在这里插入图片描述

//获取类的成员变量_方法说明及使用
public class GetField {
    public static void main(String[] args) throws Exception{
        Class clazz = Users.class;
        Field[] field =clazz.getFields();
        for (Field f:field ){
            System.out.println(f);
            System.out.println(f.getName());
        }

        System.out.println("=======================");
        Field[] field1 = clazz.getDeclaredFields();
        for (Field f:field1){
            System.out.println(f);
        }

        System.out.println("----------------------");
        Field field2 = clazz.getField("userage");
        System.out.println(field2.getName());

        System.out.println("===================");
        Field field3 = clazz.getDeclaredField("username");
        System.out.println(field3.getName());
    }
}

2.操作成员变量

//获取类的成员变量_操作成员变量
public class GetField2 {
    public static void main(String[] args) throws Exception{
        Class clazz = Users.class;
        Field field = clazz.getField("userage");
        //对象实例化
        Object obj = clazz.newInstance();
        //为成员变量赋予新的值
        field.set(obj,18);
        //获取成员变量的值
        Object o = field.get(obj);
        System.out.println(o);
    }
}

六、获取类的方法

1.方法说明及使用

在这里插入图片描述

//获取类的方法_方法说明及使用
public class GetMethod {
    public static void main(String[] args) throws Exception{
        Class clazz = Users.class;
        //此方法会get包括继承Object的方法
        Method[] methods = clazz.getMethods();
        for (Method m:methods){
            System.out.println(m);
            System.out.println(m.getName());
        }
        System.out.println("----------------------------");
        Method[] methods1 = clazz.getDeclaredMethods();
        for (Method m:methods1){
            System.out.println(m.getName());
        }

        System.out.println("=======================");
        Method method = clazz.getMethod("setUserage", int.class);
        System.out.println(method.getName());

        System.out.println("-------------------------");
        Method method1 = clazz.getDeclaredMethod("sayhello");
        System.out.println(method1.getName());
    }
}

举报

相关推荐

java学习笔记-反射

【Java基础学习笔记】反射

java学习笔记之反射

JAVA 基础学习-反射笔记

Java 反射学习笔记

反射技术。。。。

反射笔记

反射技术总结

0 条评论