Java面试题-你会使用Java反射吗

1.什么是Java反射

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

2.反射机制的作用

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

3.有哪些地方使用到了反射

Jdbc 加载驱动
Spring IOC的底层
Hibernate、Mybatis、等各种框架(基本上各种ORM框架都使用到了反射)

4.为什么要学习反射

1、如果你想了解各种框架的实现原理,反射是必不可少的
2、如果你想封装一个自己的ORM工具、封装一个代码自动生成器,反射技术也是必不可少的

5.为什么已有class文件,却要用反射获得实例对象

1、反射是动态编译,new是静态编译
2、因为java反射可以对私有的构造参数实例化,私有构造参数你是new不出来的

6.反射创建对象有几种方式

答:有三种:

package com.lijie;

public class User {

    private String userName;

    private String alias;

    public static void main(String[] args) {
        try {
            //第一种反射创建方式方式:
            Class<?> forName = Class.forName("com.lijie.User"); //指定加载类

            //第二种方式:java中每个类型都有class 属性
            Class<?> forName2 = User.class;

            //第三种方式:java语言中任何一个java对象都有getClass 方法
            User user1 = new User();
            Class<?> forName3 = user1.getClass();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

7.反射机制的怎么在运行中动态获取所有属性和方法

//第一种反射创建方式:
Class<?> forName = Class.forName("com.lijie.User"); //指定加载类

 //反射创建对象,赋值给对象
User user = (User)forName.newInstance();

//获取所有方法名称
Method[] methods = forName.getMethods();
for (Method method:methods) {
	System.out.println("User类中的"+method.getName()+"方法");
}

 //获取所有属性名称
Field[] fields = forName.getDeclaredFields();
for (Field field:fields) {
	 System.out.println("User类中的"+field.getName()+"属性");
}

8.私有构成参数使用反射实例化

答:可以(假象如果单例模式别人通过反射创建很多对象怎么办)

package com.lijie;

public class User {

    private String userName;

    private String alias;

    private User(){
        
    }

}

package com.lijie;

import java.lang.reflect.Constructor;

public class Test {

    public static void main(String[] args) {
        try {
            //私有构成参数创建对象:
            Constructor<?> cs = User.class.getDeclaredConstructor();
            cs.setAccessible(true);
            User user=(User)cs.newInstance();
            System.out.println(user);

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

9.使用反射为类私有属性赋值

package com.lijie;

public class User {

    private String userName;

    public String getUserName() {
        return userName;
    }

}

package com.lijie;

import java.lang.reflect.Field;

public class Test {

    public static void main(String[] args) {
        try {
            // 为user对象私有属性赋值
            Class<?> classUser = Class.forName("com.lijie.User");

            // 获取到当前的所有属性
            Field[] fields = classUser.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field.getName());
            }

            // 初始化对象
            User user = (User) classUser.newInstance();
            Field declaredField = classUser.getDeclaredField("userName");

            // 标记为true 允许反射赋值
            declaredField.setAccessible(true);
            declaredField.set(user, "李杰");
            System.out.println("使用反射机制给id赋值为:"+user.getUserName());

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

发布了49 篇原创文章 · 获赞 52 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43122090/article/details/104853807