• Java反射机制详情(2)


    | |目录

    • 运行环境
    • Java语言的反射机制
    • Class中的常用方法(获得类的构造方法)
    • Class中的常用方法(获得类的属性)
    • Class中的常用方法(获得类的方法)
    • 反射动态调用类的成员

    1.运行环境

    JDK8+lntellij IDEA 2018.3

    2.Java 语言的反射机制

    • Java 反射是Java语言的一个很重要的特征,它使得Java具有了“动态性”。
    • Java提供了一套机制来动态获取类的信息以及动态调用对象的方法的功能,这套机制就叫——反射
    • 反射机制是如今很多流行框架的实现基础,其中包括Struts、Spring、Hibernate等。

    3.Class中的常用方法(获得类的构造方法)

    • getConstructors():获得类的所有的public类型的构造方法。
    • getDeclaredConstructors():获得类所有的构造方法
    • getConstructor(Class[] parameterTypes):获得类的特定public的构造方法, parameterTypes 参数指定构造方法的参数类型。
    • getDeclaredConstructor(Class[] parameterTypes):获得类指定的所有的构造方法

    4.Class中的常用方法(获得类的属性)

    • getFields():获得类的public类型的属性。
    • getDeclaredFields():获得类本身的所有属性
    • getField(String):获得指定名字的public类型的属性对象
    • getDeclaredField(String)获得类自己的指定名字的属性对象

      Field类:

    • getModifiers():获得属性的修饰符(Modifier.toString(int)显示对应的修饰符类型)
    • getType() : 获得属性的类型 

    5.Class中的常用方法(获得类的方法)

    • getMethods():获得类的public类型的方法。
    • getDeclaredMethods():获得类的所有方法。
    • getMethod(String name, Class[] parameterTypes):获得类的特定public的方法, name参数指定方法的名字, parameterTypes 参数指定方法的参数类getDeclaredMethod(String name, Class[] parameterTypes)

      Method类:

    • getParameterTypes() :获得方法的所有参数类型
    • getReturnType():获得方法的返回值类型

    6.反射动态调用类的成员

    调用方法步骤:

      设定调用方法的参数列表(Class[])

      获得调用方法的对象(Method)

      设定调用方法的参数的值(Object[])

      普通方法:invoke(obj,values);

      构造方法:newInstance(values)

    调用属性步骤:

      根据属性名字获得属性对象(Field)

      赋值:set(obj,value)

      取值:get(obj) 如果需要强制访问类的私有成员,则需要设定: setAccessible(true);


    Øjdbc.properties代码

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
    user=root
    password=
    Ø/*jdbc读到内存中反射体验*/代码
    public class DBUtil{
        static Properties properties = new Properties();
        private static  String DRIVER;
        private static  String URL;
        private static  String USER;
        private static  String PASSWORD;
        public static void main(String[] args) throws IOException {
            System.out.println("main:"+"hello");
            Connection connection=DBUtil.getConnection(URL,USER,PASSWORD);
        }
    
    
        static {
            String path="jdbc.properties";
            InputStream is= DBUtil.class.getClassLoader().getResourceAsStream(path);
            try {
                properties.load(is);
            } catch (IOException e) {
                e.printStackTrace();
            }
            DRIVER=  properties.getProperty("driver");
            URL= properties.getProperty("url");
            USER= properties.getProperty("user");
            PASSWORD=properties.getProperty("password");
            System.out.println("DRIVER:"+DRIVER+"URL:"+URL+"");
            try {
                Class.forName(DRIVER);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        static  Connection connection= null;
        public static Connection getConnection(String url,String user,String password){
            try {
                connection= DriverManager.getConnection(url,user,password);
                System.out.println("connection:"+connection);
            } catch (SQLException e) {
                e.printStackTrace();
            }catch (Exception e){
                e.printStackTrace();
            }
            return connection;
        }
    
    }
    Ø三种获取类,代码
    public class ReflectDemo1 {
        public static void main(String[] args) {
            Student student = new Student();
            //1.  object.getClass(); 引用类型, .getClass(),定义在Object对象
            Class clzStu1=student.getClass();
    
            //2. .class 适用于所有的数据类型
            Class clzStu2=Student.class;
    
            //3. Class.forName(""); 先把类加载到内存中,得到类对象
            Class clzStu3=null;
    
            try {
                clzStu3=Class.forName("com.javaboy.pojo.Student");
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            System.out.println(clzStu1==clzStu2);
            System.out.println(clzStu2==clzStu3);
            System.out.println(clzStu1==clzStu3);
        }
    }
    
    

    Ø效果图

    Ø总结

      Class是一个特殊的类,

      它的实例用来表示一个.class文件在内存中的存在形势。

      反射就是照镜子,照出类的内部结构。 利用反射,可以在运行状态下初始化类。


    心得:
      为什么要努力?
      因为还有很多人毫不费力的过着我想要的生活
      因为我对这个世界还有欲望,为了更自由,为了被尊重
      为了不把世界让给我讨厌的人。
      为了对得起未来的自己
      如果你从此时此刻开始努力,最坏的结果,不过是大器晚成
      今天是你余生中最年轻的一天,从今天去开始努力,即使暂时看不到希望
      也要相信自己,相信明天你会感谢今天的努力。
      
  • 相关阅读:
    Java数据类型转换
    Java数据类型
    Revisiting Network Support for RDMA
    FBOSS: Building Switch Software at Scale
    Edge-assisted Traffic Engineering and applications in the IoT
    Edge Intelligence: On-Demand Deep Learning Model Co-Inference with Device-Edge Synergy
    ARVE: Augmented Reality Applications in Vehicle to Edge Networks
    Deployment Characteristics of "The Edge" in Mobile Edge Computing
    CABaRet: Leveraging Recommendation Systems for Mobile Edge Caching
    Anveshak: Placing Edge Servers In The Wild
  • 原文地址:https://www.cnblogs.com/dyywht/p/13549662.html
Copyright © 2020-2023  润新知