Java反射重要吗?,java基础面试题的书籍有哪些

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

*

* 设置字段的值:

* Field --> public void set(Object obj,Object value):

* 参数说明:

* 1.obj:要设置的字段所在的对象;

* 2.value:要为字段设置的值;

*

*/

public

class Fields {

public static void main(String[] args) throws Exception {

//1.获取Class对象

Class stuClass = Class.forName(

“fanshe.field.Student”);

//2.获取字段

System.out.println(

“************获取所有公有的字段********************”);

Field[] fieldArray = stuClass.getFields();

for(Field f : fieldArray){

System.out.println(f);

}

System.out.println(

“************获取所有的字段(包括私有、受保护、默认的)********************”);

fieldArray = stuClass.getDeclaredFields();

for(Field f : fieldArray){

System.out.println(f);

}

System.out.println(

“*************获取公有字段**并调用***********************************”);

Field f = stuClass.getField(

“name”);

System.out.println(f);

//获取一个对象

Object obj = stuClass.getConstructor().newInstance();

//产生Student对象–》Student stu = new Student();

//为字段设置值

f.set(obj,

“刘德华”);

//为Student对象中的name属性赋值–》stu.name = “刘德华”

//验证

Student stu = (Student)obj;

System.out.println(

“验证姓名:” + stu.name);

System.out.println(

“**************获取私有字段****并调用********************************”);

f = stuClass.getDeclaredField(

“phoneNum”);

System.out.println(f);

f.setAccessible(

true);

//暴力反射,解除私有限定

f.set(obj,

“18888889999”);

System.out.println(

“验证电话:” + stu);

}

}

后台输出:

************获取所有公有的字段********************

public java.lang.String fanshe.field.Student.name

************获取所有的字段(包括私有、受保护、默认的)********************

public java.lang.String fanshe.field.Student.name

protected

int fanshe.field.Student.age

char fanshe.field.Student.sex

private java.lang.String fanshe.field.Student.phoneNum

*************获取公有字段**并调用***********************************

public java.lang.String fanshe.field.Student.name

验证姓名:刘德华

**************获取私有字段****并调用********************************

private java.lang.String fanshe.field.Student.phoneNum

验证电话:Student [name=刘德华, age=

0, sex=

由此可见

调用字段时:需要传递两个参数:

Object obj = stuClass.getConstructor().newInstance();//产生Student对象–》Student stu = new Student();

//为字段设置值

f.set(obj, “刘德华”);//为Student对象中的name属性赋值–》stu.name = “刘德华”

第一个参数:要传入设置的对象,第二个参数:要传入实参

4、获取成员方法并调用


student类:

package fanshe.method;

public

class Student {

//**************成员方法***************//

public void show1(String s){

System.out.println(

"调用了:公有的,String参数的show1(): s = " + s);

}

protected void show2(){

System.out.println(

“调用了:受保护的,无参的show2()”);

}

void show3(){

System.out.println(

“调用了:默认的,无参的show3()”);

}

private String show4(int age){

System.out.println(

"调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);

return

“abcd”;

}

}

测试类:

package fanshe.method;

import java.lang.reflect.Method;

/*

* 获取成员方法并调用:

*

* 1.批量的:

* public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)

* public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

* 2.获取单个的:

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

* 参数:

* name : 方法名;

* Class … : 形参的Class类型对象

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

*

* 调用方法:

* Method --> public Object invoke(Object obj,Object… args):

* 参数说明:

* obj : 要调用方法的对象;

* args:调用方式时所传递的实参;

):

*/

public

class MethodClass {

public static void main(String[] args) throws Exception {

//1.获取Class对象

Class stuClass = Class.forName(

“fanshe.method.Student”);

//2.获取所有公有方法

System.out.println(

“***************获取所有的”公有“方法*******************”);

stuClass.getMethods();

Method[] methodArray = stuClass.getMethods();

for(Method m : methodArray){

System.out.println(m);

}

System.out.println(

“***************获取所有的方法,包括私有的*******************”);

methodArray = stuClass.getDeclaredMethods();

for(Method m : methodArray){

System.out.println(m);

}

System.out.println(

“***************获取公有的show1()方法*******************”);

Method m = stuClass.getMethod(

“show1”, String.class);

System.out.println(m);

//实例化一个Student对象

Object obj = stuClass.getConstructor().newInstance();

m.invoke(obj,

“刘德华”);

System.out.println(

“***************获取私有的show4()方法******************”);

m = stuClass.getDeclaredMethod(

“show4”,

int.class);

System.out.println(m);

m.setAccessible(

true);

//解除私有限定

Object result = m.invoke(obj,

20);

//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

System.out.println(

“返回值:” + result);

}

}

控制台输出:

***************获取所有的”公有“方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

public

final

void java.lang.Object.wait(

long,

int)

throws java.lang.InterruptedException

public

final

native

void java.lang.Object.wait(

long)

throws java.lang.InterruptedException

public

final

void java.lang.Object.wait()

throws java.lang.InterruptedException

public

boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public

native

int java.lang.Object.hashCode()

public

final

native java.lang.Class java.lang.Object.getClass()

public

final

native

void java.lang.Object.notify()

public

final

native

void java.lang.Object.notifyAll()

***************获取所有的方法,包括私有的*******************

public

void fanshe.method.Student.show1(java.lang.String)

private java.lang.String fanshe.method.Student.show4(

int)

protected

void fanshe.method.Student.show2()

void fanshe.method.Student.show3()

***************获取公有的show1()方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

调用了:公有的,String参数的show1(): s = 刘德华

***************获取私有的show4()方法******************

private java.lang.String fanshe.method.Student.show4(

int)

调用了,私有的,并且有返回值的,

int参数的show4(): age =

20

返回值:abcd

由此可见:

m = stuClass.getDeclaredMethod(“show4”, int.class);//调用制定方法(所有包括私有的),需要传入两个参数,第一个是调用的方法名称,第二个是方法的形参类型,切记是类型。

System.out.println(m);

m.setAccessible(true);//解除私有限定

Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参

System.out.println(“返回值:” + result);//

控制台输出:

***************获取所有的”公有“方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

public

final

void java.lang.Object.wait(

long,

int)

throws java.lang.InterruptedException

public

final

native

void java.lang.Object.wait(

long)

throws java.lang.InterruptedException

public

final

void java.lang.Object.wait()

throws java.lang.InterruptedException

public

boolean java.lang.Object.equals(java.lang.Object)

public java.lang.String java.lang.Object.toString()

public

native

int java.lang.Object.hashCode()

public

final

native java.lang.Class java.lang.Object.getClass()

public

final

native

void java.lang.Object.notify()

public

final

native

void java.lang.Object.notifyAll()

***************获取所有的方法,包括私有的*******************

public

void fanshe.method.Student.show1(java.lang.String)

private java.lang.String fanshe.method.Student.show4(

int)

protected

void fanshe.method.Student.show2()

void fanshe.method.Student.show3()

***************获取公有的show1()方法*******************

public

void fanshe.method.Student.show1(java.lang.String)

调用了:公有的,String参数的show1(): s = 刘德华

***************获取私有的show4()方法******************

private java.lang.String fanshe.method.Student.show4(

int)

调用了,私有的,并且有返回值的,

int参数的show4(): age =

20

返回值:abcd

其实这里的成员方法:在模型中有属性一词,就是那些setter()方法和getter()方法。还有字段组成,这些内容在内省中详解

5、反射main方法


student类:

package fanshe.main;

public

class Student {

public static void main(String[] args) {

System.out.println(

“main方法执行了。。。”);

}

}

测试类:

package fanshe.main;

import java.lang.reflect.Method;

/**

* 获取Student类的main方法、不要与当前的main方法搞混了

*/

public

class Main {

public static void main(String[] args) {

try {

//1、获取Student对象的字节码

Class clazz = Class.forName(

“fanshe.main.Student”);

//2、获取main方法

Method methodMain = clazz.getMethod(

“main”, String[].class);

//第一个参数:方法名称,第二个参数:方法形参的类型,

//3、调用main方法

// methodMain.invoke(null, new String[]{“a”,“b”,“c”});

//第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组,这里要注意在jdk1.4时是数组,jdk1.5之后是可变参数

//这里拆的时候将 new String[]{“a”,“b”,“c”} 拆成3个对象。。。所以需要将它强转。

methodMain.invoke(

null, (Object)

new String[]{

“a”,

“b”,

“c”});

//方式一

// methodMain.invoke(null, new Object[]{new String[]{“a”,“b”,“c”}});//方式二

}

catch (Exception e) {

e.printStackTrace();

}

}

}

控制台输出:

main方法执行了。。。

6、反射方法的其它使用之—通过反射运行配置文件内容


student类:

public

class Student {

public void show(){

System.out.println(

“is show()”);

}

}

配置文件以txt文件为例子(pro.txt):

className = cn.fanshe.Student

methodName = show

测试类:

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.lang.reflect.Method;

import java.util.Properties;

/*

* 我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改

* 我们只需要将新类发送给客户端,并修改配置文件即可

*/

public

class Demo {

public static void main(String[] args) throws Exception {

//通过反射获取Class对象

Class stuClass = Class.forName(getValue(

“className”));

//“cn.fanshe.Student”

//2获取show()方法

Method m = stuClass.getMethod(getValue(

“methodName”));

//show

//3.调用show()方法

m.invoke(stuClass.getConstructor().newInstance());

}

//此方法接收一个key,在配置文件中获取相应的value

public static String getValue(String key) throws IOException{

Properties pro =

new Properties();

//获取配置文件的对象

FileReader in =

new FileReader(

“pro.txt”);

//获取输入流

pro.load(in);

//将流加载到配置文件对象中

in.close();

return pro.getProperty(key);

//返回根据key获取的value值

}

}

控制台输出:

is show()

需求:

当我们升级这个系统时,不要Student类,而需要新写一个Student2的类时,这时只需要更改pro.txt的文件内容就可以了。代码就一点不用改动

要替换的student2类:

public

class Student2 {

public void show2(){

System.out.println(

“is show2()”);

}

}

配置文件更改为:

className = cn.fanshe.Student2

methodName = show2

控制台输出:

is show2();

7、反射方法的其它使用之—通过反射越过泛型检查


泛型用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的

测试类:

import java.lang.reflect.Method;

import java.util.ArrayList;

/*

* 通过反射越过泛型检查

*

* 例如:有一个String泛型的集合,怎样能向这个集合中添加一个Integer类型的值?

*/

public

class Demo {

public static void main(String[] args) throws Exception{

ArrayList strList =

new ArrayList<>();

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

//第一个参数,对象类型,因为方法是static静态的,所以为null可以,第二个参数是String数组,这里要注意在jdk1.4时是数组,jdk1.5之后是可变参数

//这里拆的时候将 new String[]{“a”,“b”,“c”} 拆成3个对象。。。所以需要将它强转。

methodMain.invoke(

null, (Object)

new String[]{

“a”,

“b”,

“c”});

//方式一

// methodMain.invoke(null, new Object[]{new String[]{“a”,“b”,“c”}});//方式二

}

catch (Exception e) {

e.printStackTrace();

}

}

}

控制台输出:

main方法执行了。。。

6、反射方法的其它使用之—通过反射运行配置文件内容


student类:

public

class Student {

public void show(){

System.out.println(

“is show()”);

}

}

配置文件以txt文件为例子(pro.txt):

className = cn.fanshe.Student

methodName = show

测试类:

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.lang.reflect.Method;

import java.util.Properties;

/*

* 我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改

* 我们只需要将新类发送给客户端,并修改配置文件即可

*/

public

class Demo {

public static void main(String[] args) throws Exception {

//通过反射获取Class对象

Class stuClass = Class.forName(getValue(

“className”));

//“cn.fanshe.Student”

//2获取show()方法

Method m = stuClass.getMethod(getValue(

“methodName”));

//show

//3.调用show()方法

m.invoke(stuClass.getConstructor().newInstance());

}

//此方法接收一个key,在配置文件中获取相应的value

public static String getValue(String key) throws IOException{

Properties pro =

new Properties();

//获取配置文件的对象

FileReader in =

new FileReader(

“pro.txt”);

//获取输入流

pro.load(in);

//将流加载到配置文件对象中

in.close();

return pro.getProperty(key);

//返回根据key获取的value值

}

}

控制台输出:

is show()

需求:

当我们升级这个系统时,不要Student类,而需要新写一个Student2的类时,这时只需要更改pro.txt的文件内容就可以了。代码就一点不用改动

要替换的student2类:

public

class Student2 {

public void show2(){

System.out.println(

“is show2()”);

}

}

配置文件更改为:

className = cn.fanshe.Student2

methodName = show2

控制台输出:

is show2();

7、反射方法的其它使用之—通过反射越过泛型检查


泛型用在编译期,编译过后泛型擦除(消失掉)。所以是可以通过反射越过泛型检查的

测试类:

import java.lang.reflect.Method;

import java.util.ArrayList;

/*

* 通过反射越过泛型检查

*

* 例如:有一个String泛型的集合,怎样能向这个集合中添加一个Integer类型的值?

*/

public

class Demo {

public static void main(String[] args) throws Exception{

ArrayList strList =

new ArrayList<>();

总结:心得体会

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。

学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。

面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。

大厂Java架构核心笔记(适合中高级程序员阅读):

[外链图片转存中…(img-3TNgeu0Y-1713617371048)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-zOx1nkb4-1713617371049)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值