二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?

  1. 初始化:如果该类有父类,则对其初始化,执行静态初始化器和静态初始化块。

3. Java反射框架主要提供以下功能:


  • 在运行时构造任意一个类的对象
  • 在运行时调用任意一个对象的方法
  • 在运行时判断任意一个对象所属的类
  • 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)

反射的基本用法

====================================================================

1. 获得Class对象


<1> 使用Class类的forName静态方法:

public static Class<?> forName(String className)

在JDBC开发中常用此方法加载数据库驱动: Class.forName(driver);

<2> 直接获取某一个对象的class:(编译时已知类型名称或已知对象)

Class<?> klass = int.class;

Class<?> classInt = Integer.TYPE;

<3> 调用某个对象的getClass()方法:

StringBuilder str = new StringBuilder(“123”);

Class<?> klass = str.getClass();

注意: 使用.class来创建Class对象的引用时,不会自动初始化该Class对象,使用forName(…)会自动初始化该Class对象。

2. 判断是否为某个类的实类


一般:用instanceof关键字判断

反射:反射中Class对象的isInstance()方法

public native boolean isInstance(Object obj);

3.创建实例


通过反射来生成对象主要有两种方式:

<1> 使用Class对象的newInstance()方法来创建Class对象对应类的实例。

Class<?> c = String.class;

Object str = c.newInstance();

<2> 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。

// 获取String所对应的Class对象

Class<?> c = String.class;

// 获取String类带一个String参数的构造器

Constructor constructor = c.getConstructor(String.class);

// 根据构造器创建实例

Object obj = constructor.newInstance(“23333”);

System.out.println(obj);

4. 获取构造器信息


主要是通过Class类的getConstructor方法得到Constructor类的一个实例,而Constructor类有一个newInstance方法可以创建一个对象实例

5. 获取方法


<1> getDeclaredMethods() – 返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

public Method[] getDeclaredMethods() throws SecurityException

<2> getMethods() – 返回某个类的所有公共(public)方法,包括继承的公有方法

public Method[] getMethods() throws SecurityException

<3> getDeclaredMethod() – 返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数类型对应的Class对象

public Method getDeclaredMethod(String name, Class<?>… parameterTypes)

<4> getMethod() – 返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数类型对应的Class对象

public Method getMethod(String name, Class<?>… parameterTypes)

6. 获取类的成员变量(字段)信息


  • getDeclaredFields() – 访问所有已声明的成员变量,但不能访问继承的成员变量。

  • getFileds() – 访问所有已声明的公有(public)成员变量,包括继承的公有成员变量。

  • getDeclaredField() – 特定访问所有成员变量(不包括继承的),参数为成员变量的名字。

  • getFiled() – 特定访问公有成员变量(包括继承的),参数为成员变量的名字。

7. 利用反射创建数组


Class<?> cls = Class.forName(“java.lang.String”);

Object array = Array.newInstance(cls, 25);

//往数组里添加内容

Array.set(array, 0, “hello”);

Array.set(array, 1, “Java”);

Array.set(array, 2, “fuck”);

Array.set(array, 3, “Scala”);

Array.set(array, 4, “Clojure”);

//获取某一项的内容

System.out.println(Array.get(array,3));

其中的Array类为java.lang.reflect.Array类,我们通过Array.newInstance()创建数组对象,它的原型是:

public static Object newInstance(Class<?> componentType, int length) throws NegativeArraySizeException {

return newArray(componentType, length);

}

newArray()方法是一个Native方法:

private static native Object newArray(Class<?> componentType, int length) throws NegativeArraySizeException;

反射的注意事项

====================================================================

由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

pe, int length) throws NegativeArraySizeException;

反射的注意事项

====================================================================

由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。

最后

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

[外链图片转存中…(img-nnpjQuuI-1718874693345)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值