前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >020.Java的反射机制

020.Java的反射机制

作者头像
qubianzhong
发布2018-11-21 18:05:19
3390
发布2018-11-21 18:05:19
举报
文章被收录于专栏:行者常至行者常至行者常至

定义

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


应用场景

Jdbc 加载驱动----- Spring ioc 框架


获取类的三种方式

package cn.qbz.thread;

public class Test112003 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c1 = Class.forName("cn.qbz.thread.Test112002");
        System.out.println(c1);

        Class c2 = Test112002.class;
        System.out.println(c2);

        Test112002 test112002 = new Test112002();
        Class c3 = test112002.getClass();
        System.out.println(c3);
    }
}

创建对象的两种方式

package cn.qbz.thread;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test112003 {
    public static void main(String[] args) throws ClassNotFoundException,
            IllegalAccessException, InstantiationException,
            NoSuchMethodException, InvocationTargetException {
        //通过无参构造器构造创建对象
        Class c1 = Class.forName("cn.qbz.thread.User");
        User user = (User) c1.newInstance();
        user.setName("xiaoMing");
        System.out.println(user.getName());

        //通过有参构造器创建对象
        Constructor constructor = c1.getConstructor(String.class, String.class);
        User user2 = (User) constructor.newInstance("xiaoWang", "http://xiaowang.cn");
        System.out.println("name:" + user2.getName() + "\t" + "url:" + user2.getUrl());
    }
}

class User {
    private String name;
    private String url;

    public User() {
    }

    public User(String name, String url) {
        this.name = name;
        this.url = url;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

常用API

方法名称

作用

getDeclaredMethods []

获取该类的所有方法

getReturnType()

获取该类的返回值

getParameterTypes()

获取传入参数

getDeclaredFields()

获取该类的所有字段

setAccessible

允许访问私有成员

package cn.qbz.thread;

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

public class Test112003 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
        Class usr = Class.forName("cn.qbz.thread.User");
        //获取所有属性
        Field[] fields = usr.getDeclaredFields();
        for (Field field : fields) {
            System.out.println("属性:" + field.getName());
        }

        //获取所有方法
        Method[] methods = usr.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("method:" + method.getName());
        }

        //初始化对象
        User user = (User) usr.newInstance();
        //使用反射赋值属性
        Field fieldName = usr.getDeclaredField("name");
        // 标记为true 允许反射赋值
        fieldName.setAccessible(true);
        fieldName.set(user, "xiaoMing");

        System.out.println("usr.name:" + user.getName());

    }
}

class User {
    private String name;
    private String url;

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

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();
    }
}

禁止使用反射机制初始化

  • 将构造函数为私有化
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义
  • 应用场景
  • 获取类的三种方式
  • 创建对象的两种方式
  • 常用API
  • JDBC反射加载驱动
  • 禁止使用反射机制初始化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档