java反射机制

博客介绍了Java反射机制,它能在运行时动态获取类的所有信息,可用于初始化类和给私有属性赋值,核心是获取当前类的class文件。其作用是提高程序扩展性、封装工具类和写框架,可通过将类构造函数私有化禁止。应用场景包括SpringIoc、jdbc连接驱动等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射机制:

就是正在运行动态获取当前的类的所有信息。

类不用new,使用java的反射机制帮助去初始化,类私有属性可以使用反射机制去赋值

核心:获取当前类的class文件

反射机制的作用:

提高程序的扩展性,封装一些工具类,写框架

如何禁止java的反射机制?

将类的构造函数私有化

应用场景:

SpringIoc,jdbc连接驱动,框架

创建一个User类:

package com.example.demo.fanshe;


/**
 * @author:qsc
 * @date: 2019/5/5
 * @time: 15:03
 * @Describe:
 */

public class User {

    private String id;
    private String name;


    public User(){
        System.out.println(" 无参构造函数使用反射机制创建对象");
    }

    public User(String id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("有参参构造函数使用反射机制创建对象");
    }

    public String getId() {

        return id;
    }

    public void setId(String id) {

        this.id = id;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {

        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

test:

package com.example.demo.fanshe;


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

/**
 * @author:qsc
 * @date: 2019/5/5
 * @time: 15:03
 * @Describe:
 */
public class test01 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //1通过new
       // User user=new User();
        //2通过反射,地址必须要写完整路径
        Class<?> forName=Class.forName("com.example.demo.fanshe.User");
        //通过默认无参构造函数创建对象,newInstance()就是使用java的反射机制创建对象
        User user2= (User) forName.newInstance();
        user2.setId("22");
        System.out.println(user2);

        //创建带有参的构造函数
        Constructor<?> constructor=forName.getConstructor(String.class,String.class);
        User user1= (User)constructor.newInstance("12","狗");
        System.out.println(user1.toString());

    }
}

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

使用反射访问私有属性:

package com.example.demo.fanshe;

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

/**
 * @author:qsc
 * @date: 2019/5/5
 * @time: 15:25
 * @Describe:
 */
public class test02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
        //1.使用java的反射机制,获取类的所有属性方法,并且为私有属性赋值
        Class<?> forName=Class.forName("com.example.demo.fanshe.User");
        //2.获取当前类的所有属性
          Field[] declardFields=forName.getDeclaredFields();
          for(Field field:declardFields){
              System.out.println(field.getName());
          }

          //3获取当前类的所有的方法
        Method[]  methods=forName.getDeclaredMethods();
        for(Method method:methods){
            System.out.println(method.getName());
        }

        //4使用java反射机制给私有属性赋值
        Object newIntance=forName.newInstance();
        Field id=forName.getDeclaredField("id");
        //允许反射操作私有属性,不加上这条权限设置会报错
        id.setAccessible(true);
        id.set(newIntance,"20");
        Field name=forName.getDeclaredField("name");
        name.setAccessible(true);
        name.set(newIntance,"狗");
        User user= (User) newIntance;
        System.out.println(user);
    }
}

如果在xml中:

<beans>
	<bean id="user1" class="com.itmayiedu.entity.UserEntity">
		<property name="userId" value="1"></property>
		<property name="userName" value="猫"></property>
	</bean>
	<bean id="user2" class="com.itmayiedu.entity.UserEntity">
		<property name="userId" value="2"></property>
		<property name="userName" value="狗"></property>
	</bean>
</beans>

java代码:

//1.读取springxml配置
		ClassPathXmlApplicationContext classPath = new 
                   ClassPathXmlApplicationContext("applicationContext.xml");
		//2.通过Bean Id获取bean对象
		User user = (User) classPath.getBean("user2");
		System.out.println(user.getUserName());

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值