Java反射机制的大厂面试题

Java反射机制的大厂面试题反射机制概念

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

为什么引入反射概念[color=rgba(0, 0, 0, 0.75)]写下如下代码

public class Main{
    public static int number = 1;
    public static void main(String args[]) {
        System.out.println("hello World");
    }
}

调用javac Main.java命令将Main.java文件编译成Main.class文件
之后执行java Main命令后,java虚拟机启动,进行类加载过程,方法区中存储类的静态存储结构,同时在内存中生成一个代表该类的java.lang.Class对象,作为方法区中该类的各种数据的访问入口
上述过程表明,编译阶段,就已经明确java虚拟机要加载的类(Main类),如果你的程序运行中,突然需要加载远程服务器的类(运行中加载),这时候反射机制就粉墨登场
有一个很经典的场景就是加载数据库驱动类,只有运行的时候通过参数,才能确定是加载com.java.dbtest.myqlConnection(mysql驱动类),还是加载com.java.dbtest.oracleConnection
此时只需要简单调用Class.forName(com.java.dbtest.myqlConnection)即可动态得完成加载类的过程。
利用反射机制对类进行两次加载

import java.io.IOException;
import java.io.InputStream;
public class Main{
    public static void main(String args[]) throws Exception{
        //自定义类加载器
        ClassLoader myLoader = new ClassLoader() {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException{
                try{
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream is = getClass().getResourceAsStream(fileName);
                    if(is == null) {
                        return super.loadClass(name);
                    }
                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b, 0,  b.length);
                }catch(IOException e) {
                    throw new ClassNotFoundException(name);
                }
            }
        };
        //使用反射机制加载并实例化
        Object obj = myLoader.loadClass("Main").newInstance();
 
        System.out.print(obj instanceof Main);
 
    }
}
 
//结果为false

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值