美文网首页程序员
理解4:反射

理解4:反射

作者: 小蜜蜂_Jade | 来源:发表于2020-06-16 11:04 被阅读0次

介绍

指在运行状态中:
任意一个类,都能够知道这个类所有属性和方法;
任意一个对象,都能调用它的任意一个属性和方法;

获取Class对象的两种方式

动态获取信息,需依靠Class对象
Java获取Class对象方法:

  1. 知道具体类
Class alunbarClass = TargetObject.class;
  1. 不知道具体类
//遍历包下面的类来获取Class对象
Class alunbarClass1 = Class.forName("cn.yufchen.TargetObject");

静态编译和动态编译

  • 静态编译:在编译时确定类型,绑定对象
  • 动态编译:运行时确定类型,绑定对象

优缺点

  • 优点:运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点:性能瓶颈:反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的java代码要慢很多。
    安全问题:动态操作改变类的属性同时也增加了类的安全隐患。

练习

package com.yufchen.tool;
//供com.yufchen.tool.useReflect测试反射机制用
public class TargetObject {

    private String value;

    public TargetObject() {
        value = "yufchen";
    }

    public void publicMethod(String s) {
        System.out.println("I am " + s);
    }

    private void privateMethod() {
        System.out.println("value is " + value);
    }
}
package com.yufchen.tool;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class useReflect {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {

        //获取TargetObject类的Class对象并且创建TargetObject类实例
        Class<?> targetClass = Class.forName("com.yufchen.tool.TargetObject");
        TargetObject targetObject = (TargetObject) targetClass.newInstance();

        //获取所有类中所有定义的方法
        Method[] methods = targetClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.print(method.getName() + ' ');
        }
        System.out.println();

        //获取指定方法并调用
        Method publicMethod = targetClass.getDeclaredMethod("publicMethod", String.class);
        System.out.print("获取指定方法(publicMethod)并调用: ");
        publicMethod.invoke(targetObject, "yufchen");

        //获取指定参数并对参数进行修改
        Field field = targetClass.getDeclaredField("value");
        //为了对类中的参数进行修改 取消安全检查
        field.setAccessible(true);
        field.set(targetObject, "Notyufchen");

        Method privateMethod = targetClass.getDeclaredMethod("privateMethod");
        //为了调用private方法 取消安全检查
        privateMethod.setAccessible(true);
        privateMethod.invoke(targetObject);
    }
}

//输出
publicMethod privateMethod 
获取指定方法(publicMethod)并调用: I am yufchen
value is Notyufchen
扩展
  • why used Class<?> ?

? 是通配符,对比Class<T>在于,?不限制参数必须要有具体的类型。

相关文章

  • 理解4:反射

    介绍 指在运行状态中:任意一个类,都能够知道这个类所有属性和方法;任意一个对象,都能调用它的任意一个属性和方法; ...

  • 8 涂层+全部

    涂层可以理解成第二层反射 计算优先级 1 涂层 2 反射 3 折射 4反射 5 散射 ——————————————...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • 神经心理发育

    1.发射 拥抱反射:3-6月消失 吸吮反射和觅食反射:4-7月消失 握持反射:3-4月消失 迈步反射:2月消失 颈...

  • Java反射理解

    Java反射理解 Java类型信息 RTTI(运行时类型识别)源于《Thinking in Java》一书,其作用...

  • 反射的理解

    概念: 创建对象时会先加载类的字节码文件 类的字节码文件是一个模板,必须最早加载到内存中,JVM以此来创建对象 反...

  • 反射简单理解

    学习笔记,仅供自己参考,如有不对欢迎指正 反射是什么?反射机制指,是在运行状态中,对于任意一个类,都能够知道这个类...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

  • Java反射机制

    导语 反射机制是Java程序开发语言的重要特征之一。 主要内容 认识反射 理解反射作用 利用反射来调用类的结构 具...

  • 反射机制原理的深度理解2017-12-26

    首先我们编写person.java文件如下: 然后创建测试反射机制的类 原理解析: 要理解反射机制的实现过程,首先...

网友评论

    本文标题:理解4:反射

    本文链接:https://www.haomeiwen.com/subject/suslxktx.html