• JAVA反射


    今天我们来讲一讲什么是java的反射机制,我们要了解一个新事物之前,我们应该首先的了解它的基本概念,那什么是反射呢?

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

     我们为什么要使用反射机制

    为什么使用?当然是因为好用喽,不好用早就被淘汰了,哈哈~

    我们可以像框架一样,可以写写一套机制,来处理任意的类,使程序更加的灵活

    我们首先来理一理,创建一个对象的方式有哪些呢?

    • 通过new一个对象来创建一个对象
    • 反序列化来创建一个对象(线程)
    • 反射

     new 对象:

     这样是不是创建了一个对象以后,这个对象就只能代表它这么一个对象,所以就不具有灵活性,所以我们就有了反射创建对象获得class的方法的方式

     Java反射相关类主要包括

    • Class 类型
    • Constructor 构造方法
    • Method 方法
    • Field 属性
    • 反射API将类的类型、方法、属性都封装成了类,其中最重要的类是Class,可以说,反射的使用都是从Class开始.

     一旦class文件被加载到内存中,就会为创建一个class对象,Class类可以通过Java反射机制的基础,可以动态的得到类的定义信息,包括属性 成员变量,构造方法等.

    获得class的三种方法:

    1. //class文件创建的三种方法
    2. Class c1=User.class;
    3. System.out.println(c1);
    4. Class c2=new User().getClass();
    5. System.out.println(c2);
    6. String className="feifan.com.test.User";
    7. Class c3= Class.forName(className);
    8. System.out.println(c3);
    9. //c1==c2==c3

     这里给大家提供一个反射案例,供大家参考学习

    1. //简单反射案例
    2. public static String objToJson(Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    3. String json = "{";
    4. Class c = obj.getClass();
    5. Field[] fs = c.getDeclaredFields();//获取任意一个类中的所有属性
    6. for(Field f : fs){
    7. String name = f.getName();
    8. json+=name+":";
    9. Method m = c.getMethod("get"+name.substring(0,1).toUpperCase()+name.substring(1));//动态构成get方法名称,并获取到get方法
    10. Object value = m.invoke(obj);//调用了属性的get方法
    11. json +=value+",";
    12. }
    13. json = json.substring(0,json.length()-1);
    14. json+="}";
    15. return json;//{id:值,account:值,}
    16. }
    17. public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    18. User user = new User();
    19. user.setId(10);
    20. user.setAccount("admin");
    21. user.setPassword("111");
    22. Admin admin = new Admin();
    23. admin.setNum(100);
    24. admin.setName("zhangsan");
    25. String json = MyJson.objToJson(user);
    26. System.out.println(json);
    27. }

    反射优缺点
    ● 优点:

    • 增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作
    • 提高代码的复用率,比如动态代理
    • 可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用

    ● 缺点:

    • 反射会涉及到动态类型的解析,导致性能要比非反射调用更低
    • 使用反射技术通常要在一个没有安全限制的程序运行.
    • 反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象性

  • 相关阅读:
    php报错:Malformed UTF-8 characters, possibly incorrectly encoded
    `Algorithm-Solution` `LeetCode` 6256. 将节点分成尽可能多的组
    图像随机抖动算法
    枚举与反射
    uni-app 微信小程序问题集锦
    创意写作类国际竞赛有哪些?
    pycharm opencv无法自动补全
    linux:数据库连接
    《计算广告》读书摘录笔记
    canvas 中如何实现物体的框选(六)
  • 原文地址:https://blog.csdn.net/dfdbb6b/article/details/127938969