• 设计模式之反射机制


    一、 什么是Java反射

    就是正在运行,动态获取这个类的所有信息。

    1、反射机制的作用

    - 1,反编译:.class-->.java
     -  2.通过反射机制访问java对象的属性,方法,构造方法等;

    2、反射机制的应用场景

    Jdbc 加载驱动-----

    Spring IOC

    3、反射机制获取类有三种方法

    		//第一种方式:  
    		Classc1 = Class.forName("Employee");  
    		//第二种方式:  
    		//java中每个类型都有class 属性.  
    		Classc2 = Employee.class;  
    		   
    		//第三种方式:  
    		//java语言中任何一个java对象都有getClass 方法  
    		Employeee = new Employee();  
    		Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 
    

    4、反射创建对象的方式

    		Class<?> forName = Class.forName("com.test.entity.User");
    		// 创建此Class 对象所表示的类的一个新实例 调用了User的无参数构造方法.
    		Object newInstance = forName.newInstance();
    

    实例化有参构造函数

    		Class<?> forName = Class.forName("com.test.entity.User");
    		Constructor<?> constructor = forName.getConstructor(String.class, String.class);
    		User newInstance = (User) constructor.newInstance("123", "123");
    

    5、反射创建api

    方法名称 作用

    • getDeclaredMethods [] 获取该类的所有方法
    • getReturnType() 获取该类的返回值
    • getParameterTypes() 获取传入参数
    • getDeclaredFields() 获取该类的所有字段
    • setAccessible 允许访问私有成员

    6、使用反射为类私有属性赋值

    // 为user对象私有属性赋值
    		Class<?> classUser = Class.forName("com.test.entity.User");
    		// 获取到当前的所有属性
    		Field[] fields = classUser.getDeclaredFields();
    		for (Field field : fields) {
    			System.out.println(field.getName());
    		}
    		// 获取当前所有的方法
    		Method[] declaredMethods = classUser.getDeclaredMethods();
    		for (Method method : declaredMethods) {
    			System.out.println(method.getName());
    		}
    		// 初始化对象
    		User user = (User) classUser.newInstance();
    		Field declaredField = classUser.getDeclaredField("id");
    		// 标记为true 允许反射赋值
    		declaredField.setAccessible(true);
    		declaredField.set(user, "20");
    		System.out.println("使用反射机制给id赋值为:"+user.getId());
    

    7、JDBC反射加载驱动

    public class DemoJDBC {
        public static void main(String[] args) throws Exception {
            // 加载驱动类
            Class.forName("com.mysql.jdbc.Driver");
        
            // 通过DriverManager获取数据库连接
            String url = "jdbc:mysql://192.168.1.150/test";
            String user = "teamtalk";
            String password = "123456";
            Connection connection = (Connection) DriverManager.getConnection(
                    url, user, password);
            
            PreparedStatement statement = (PreparedStatement) connection.prepareStatement(
                    "insert persion (name, age) value (?, ?)");
            statement.setString(1, "hdu");
            statement.setInt(2, 21);
            statement.executeUpdate();
            
            ResultSet resultSet = statement.executeQuery("select * from persion");
            // 操作ResultSet结果集
            while (resultSet.next()) {
                // 第一种获取字段方式
                System.out.println(resultSet.getString(1) + " " + 
                        resultSet.getString(2) + " " + resultSet.getString(3));
            }
    
            // 关闭数据库连接
            resultSet.close();
            statement.close();
            connection.close();
        }
    }
    

    个人博客 蜗牛

  • 相关阅读:
    委托~~~~~~~~~~~~~
    Lambda表达式的前世今生~~~~~~
    数据库/MySQL的安装
    flask 源码专题(十一):LocalStack和Local对象实现栈的管理
    python面试题:redis数据库
    python面试题七: mysql数据库
    wtforms: remove ' fill out this field'
    python面试题六: 剑指offer
    python面试题五:Python 编程
    python面试题四:Python web框架
  • 原文地址:https://www.cnblogs.com/codeobj/p/11750368.html
Copyright © 2020-2023  润新知