zoukankan      html  css  js  c++  java
  • java 反射的学习和实践

    本文转自:https://blog.csdn.net/ft118520/article/details/79231435

    Java反射机制

      1. 对任意的一个类都能知道这个列中的所有属性和方法,

      2. 对于任意一个对象都能调用这个他的任意属性和方法。

    反射必须要学习的一个类---------Class类   

      1. 所有的类文件都有共同的属性,路径,如字段,方法,构造函数等。把这些类向上的抽取,让他们共性的内容封装成一个类。这个类叫Class 。Class 字段中包含field、method、 constuction 。

        1.1 field 包含修饰符,类型,变量名。可以把字段封装成一个对象来获取field内容

        1.2 同理方法和构造函数Method、Contructor 要相对内容获取,必须要先获取字节码文件对象。该对象就是Class类型。

      2. Class类描述信息,类的名称,类访问属性,类包名,字段列表,方法名称列表。 

    获取Class类的三种方式

         Student s=new Student();
            Class clazz1 = s.getClass();
            Class clazz3 =Student.class;
            Class clazz2 = Class.forName("www.cn.wf.Student");

    反射的代码

    public class fanshe {
        public static void main(String args[]) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
            try {
                Class<?> clazz = Class.forName("RegExpress.Person");
                //获取所有构造器
                Constructor[] constructor = clazz.getDeclaredConstructors();
                for(int i =0;i<constructor.length;i++) {
                    System.out.println(constructor[i]);
                }
                //获取特定构造器
                Constructor con = clazz.getDeclaredConstructor(String.class,int.class,Person.class);
                //创建实例对象
                con.setAccessible(true);
                Person person = (Person) con.newInstance("dousil",33,null);
                System.out.println(person);
                
                //获取名字这个字段
                Field field = clazz.getDeclaredField("age");
                field.setAccessible(true);
                //该field是在哪个对象的上边进行数据的获取的。
                Integer age = (Integer) field.get(person);
                System.out.println(age);
                //设置field指端
                field.set(person, 22);
                System.out.println(person);
                
                //对方法的处理机制
                Method[] methods = clazz.getDeclaredMethods();
                for(Method method:methods) {
                    System.out.println(method);
                }
                Method myFriends = clazz.getDeclaredMethod("myFriends",null);
                myFriends.setAccessible(true);
                Object invoke = myFriends.invoke(person);
                System.out.println(invoke);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    为什么要用反射,以及什么时候用反射

    转自:https://blog.csdn.net/weixin_41771218/article/details/82894852

    优点

    java 反射机制就是增加程序的灵活性,避免将程序写死在代码里。例如实力话一个person()对象,不适用反射,new Person();如果想要变成实例化的其他类那么必须改代码,并重新编译。

    如果使用反射,可以将这个类的描述放到配置文件中,如**.xml中,这样如果实力化其他类,只需要修改配置文件就可以了。不需要重新修改代码并进行编译。

    增加了程序的灵活性,如strus中,请求的派发控制,当请求来到的时候,strus通过查询配置文件,找到改请求对应的action。然后在通过反射将action实例化并调用method方法。如果不适用反射,那么就只能写死在代码里边了。

    反射的缺点:

    反射的效率比不用反射的效率低很多

    反射必须要在一个安全限制的环境中运行

    破坏了代码的抽象性。破坏了抽象性,平台发生改变,代码的行为可能发生改变。

  • 相关阅读:
    搭建Linux Kettle服务端重装系统软件或帮助
    JFrame加载Browser,Jxbrowser导入
    Bonita了解
    基于用户控件固定菜单MenuStrip/ToolStripMenuItem列表及动态菜单列表,是上一篇文章的综合和升级
    winfrom打开本地默认浏览器或打开IE浏览器
    Winfrom动态添加MenuStrip菜单,同时绑定反射事件,可扩展后期动态配置
    给GroupBox动态添加一个按钮,实现展开和折叠功能
    Rest导出Excel文件流
    List<HashMap>排序,List内存分页
    解决idea项目部署到Tomcat时Artiface没有文件
  • 原文地址:https://www.cnblogs.com/dousil/p/12848498.html
Copyright © 2011-2022 走看看