java反射基础知识总结,java数组集合面试题

Constructor dc = c.getDeclaredConstructor();// 得到私有构造

dc.setAccessible(true);// 解除私有权限

ReflectBean rb = (ReflectBean) dc.newInstance();// 创建对象

Field flag = c.getDeclaredField(“flag”);//通过属性flag得到对应的Field对象

flag.setAccessible(true);// 解除私有权限

flag.setBoolean(rb, false);//修改属性值

}

Field类中修改属性值API:

set(Object obj, Object value)

setBoolean(Object obj, boolean z)

setByte(Object obj, byte b)

setChar(Object obj, char c)

setDouble(Object obj, double d)

setFloat(Object obj, float f)

setInt(Object obj, int i)

setLong(Object obj, long l)

setShort(Object obj, short s)

反射调用方法


在开发中经常遇到有某个类的对象但是方法是私有的,眼巴巴地看着不能调用,反射的强大之处就是能够让你为所欲为!

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

Method[] getMethods()

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

Method[] getDeclaredMethods()

结合之前对于构造方法和属性的获取,Class类中对方法对象的获取就很容易理解了。

为了演示反射调用方法,我们在ReflectBean中添加一个私有的方法

private void secret() {

System.out.println(“私有方法被调用了!”);

}

利用反射调用私有方法:

public static void testMethod() throws Exception{

Class c = Class.forName(“com.qj.reflect.ReflectBean”);

Constructor dc = c.getDeclaredConstructor();// 得到私有构造

dc.setAccessible(true);// 解除私有权限

ReflectBean rb = (ReflectBean) dc.newInstance();// 创建对象

Method dm = c.getDeclaredMethod(“secret”);//根据方法名称获取Method对象

dm.setAccessible(true);// 解除私有权限

dm.invoke(rb);//调用方法

}

我们向ReflectBean测试类中添加一个有参的私有方法:

private void secret(String s) {

System.out.println("有参私有方法被调用了! s : " + s);

}

反射调用有参私有方法:

//Class c , ReflectBean rb 生成步骤略

Method dm = c.getDeclaredMethod(“secret”, String.class);// 根据方法名称及方法参数类型获取Method对象

dm.setAccessible(true);// 解除私有权限

dm.invoke(rb, “方法参数内容”);// 调用方法

众所周知,我们利用反射无非是为了改变对象的属性或者调用对象的方法,下面总结一个反射的工具类,让我们使用反射易如反掌!

反射工具类


package com.qj.reflect;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

//反射工具类

public class ReflectUtil {

private ReflectUtil() {

super();

}

/**

  • 根据全类名得到一个该类的对象(仅限非私有空参构造)

  • @param className 全类名(形如com.qj.reflect.ReflectBean)

  • @return 该类的实例

  • @throws InstantiationException

  • @throws IllegalAccessException

  • @throws ClassNotFoundException

*/

public static Object newInstance(String className)

throws InstantiationException, IllegalAccessException,

ClassNotFoundException {

Class c = Class.forName(className);

Object o = c.newInstance();

return o;

}

/**

  • 根据全类名以及构造方法参数得到一个该类的对象

  • @param className 全类名(形如com.qj.reflect.ReflectBean)

  • @param args 构造方法参数(可变参数)

  • @return 该类的实例

  • @throws ClassNotFoundException

  • @throws NoSuchMethodException

  • @throws SecurityException

  • @throws InstantiationException

  • @throws IllegalAccessException

  • @throws IllegalArgumentException

  • @throws InvocationTargetException

*/

public static Object createInstance(String className, Object… args)

throws ClassNotFoundException, NoSuchMethodException,

SecurityException, InstantiationException, IllegalAccessException,

IllegalArgumentException, InvocationTargetException {

Class c = Class.forName(className);

Constructor dc = null;

int length = args.length;

if (args != null && length > 0) {//有参构造

Class[] type = new Class[length];

for (int i = 0; i < length; i++) {

type[i] = args[i].getClass();

}

dc = c.getDeclaredConstructor(type);

dc.setAccessible(true);

return dc.newInstance(args);

}

dc = c.getDeclaredConstructor();//无参构造

dc.setAccessible(true);

return dc.newInstance();

}

/**

  • 根据传过来的对象以及对象的属性名称更改属性值

  • @param obj 该类的实例

  • @param fieldName 该类的属性名称

  • @param value 要更改的属性值

  • @throws NoSuchFieldException

  • @throws SecurityException

  • @throws IllegalArgumentException

  • @throws IllegalAccessException

*/

public static void modfyField(Object obj, String fieldName, Object value)

throws NoSuchFieldException, SecurityException,

IllegalArgumentException, IllegalAccessException {

Class c = obj.getClass();

Field field = c.getDeclaredField(fieldName);

field.setAccessible(true);

field.set(obj, value);

}

/**

  • 根据传过来的对象以及对象的方法名称调用该方法

  • @param obj 该类的实例

  • @param methodName 要调用的方法

  • @param args 方法的参数(可变参数)

  • @throws NoSuchMethodException

  • @throws SecurityException

  • @throws IllegalAccessException

  • @throws IllegalArgumentException

  • @throws InvocationTargetException

*/

public static void invokeMethod(Object obj, String methodName,

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

在这里插入图片描述

最新整理电子书

在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

pfkz-1712164920486)]

最新整理电子书

[外链图片转存中…(img-5jfaHqna-1712164920486)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值