《java学习笔记》之反射机制初步,5年经验Java程序员面试27天

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

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

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

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

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

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

正文

}

2.2 java.lang.reflect.Method
(一)反射类当中所有的Method

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

//如何通过反射机制获取方法

public class reflectTest08 {

public static void main(String[] args) {

//获取类

Class userServiceClass = null;

try {

userServiceClass = Class.forName(“javasetest.UserService”);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

//获取所有的方法

Method[] methods = userServiceClass.getDeclaredMethods();

//看一下有多少方法

System.out.println(methods.length);//2

//遍历

for (Method method : methods){

//修饰符列表

System.out.println(Modifier.toString(method.getModifiers()));

//获取返回值类型

System.out.println(method.getReturnType().getSimpleName());

//获取方法名

System.out.println(method.getName());

//方法参数的修饰符列表

Class[] parameterTypes = method.getParameterTypes();

for(Class p:parameterTypes){

System.out.println(p.getSimpleName());

}

}

}

}

(二)通过反射机制调用对象的方法

import javasetest.UserService;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

/*

  • 重点:必须掌握

  • 通过反射机制再怎么调用一个对象的方法

  • */

public class reflectTest09 {

public static void main(String[] args) {

//不使用反射机制怎么调用方法?

UserService user1 = new UserService();

//调用方法

boolean log1 = user1.login(“钢铁侠”,“123”);

System.out.println(log1);//true

//使用反射机制

Class userServiceClass = null;

try {

userServiceClass = Class.forName(“javasetest.UserService”);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

//创建对象

Object object = null;

try {

object = userServiceClass.newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

//获取方法

Method methodLog = null;

try {

methodLog = userServiceClass.getMethod(“login”,String.class,String.class);

} catch (NoSuchMethodException e) {

e.printStackTrace();

}

//调用方法

Object log2 = false;

try {

log2 = methodLog.invoke(object,“美国队长”,“321”);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

System.out.println(log2);//false

}

}

2.3 java.lang.reflect.Constructor

import java.lang.reflect.Constructor;

import java.lang.reflect.Modifier;

/*

反编译一个类的Constructor构造方法

  • */

public class ReflectTest10 {

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

StringBuilder s= new StringBuilder();

Class vipClass = Class.forName(“javase.bean.Vip”);

s.append(Modifier.toString(vipClass.getModifiers()));

s.append(" class ");

s.append(vipClass.getSimpleName());

s.append(“{\n”);

//拼接构造方法

Constructor[] constructors = vipClass.getDeclaredConstructors();

for (Constructor constructor : constructors){

s.append(“\t”);

s.append(Modifier.toString(constructor.getModifiers()));

s.append(" ");

s.append(vipClass.getSimpleName());

s.append(“(”);

//拼接参数

Class[] parameterTypes = constructor.getParameterTypes();

for (Class p: parameterTypes){

s.append(p.getSimpleName());

s.append(“,”);

}

if (parameterTypes.length > 0){

s.deleteCharAt(s.length() - 1);

}

s.append(“){}\n”);

}

s.append(“}”);

System.out.println(s);

}

}

2.4 java.lang.reflect.Field:

代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。

(一)反射类当中所有的Field

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

/*

  • 反射Student类当中所有的Field(了解)

  • */

public class ReflectTest05 {

public static void main(String[] args) {

//获取整个类

try {

Class studentClass = Class.forName(“javasetest.bean.Student”);

//获取类的名字

String stringName = studentClass.getName();

System.out.println("完整类名 " + stringName);//完整类名 javasetest.bean.Student

//获取类的简单名字

String stringSimpleName = studentClass.getSimpleName();

System.out.println("简单类名 " + stringSimpleName);//简单类名 Student

//获取Student类的属性

Field[] fields = studentClass.getFields();

//想知道里面有几个属性

System.out.println(fields.length);//1

//想知道里面是什么元素

//取出整个Field

System.out.println(fields[0]);//public int javasetest.bean.Student.no

//取出这个属性的名字

//说明只有 public 修饰的可以被取出来

System.out.println(fields[0].getName());//no

//取出所有的属性

Field[] fields1 = studentClass.getDeclaredFields();

//看里面是不是有四个元素

System.out.println(fields1.length);//4

//遍历

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

//取出名字

//System.out.println(fields1[i].getName());

//获取属性的类型

//System.out.println(fields1[i].getType());

//获取属性修饰符

//int j = fields1[i].getModifiers();//1 2 4 0

//将代号转化成字符串

//String string = Modifier.toString(j);

//public

//private

//protected

//

int j = fields1[i].getModifiers();

String string = Modifier.toString(j);

Object type = fields1[i].getType();

String stringname = fields1[i].getName();

System.out.print( j +" “+ string +” "+type + " "+stringname);

System.out.println();

//1 public int no

//2 private class java.lang.String name

//4 protected int age

//0 boolean sex

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

(二)通过反编译,反编译一个类属性Field

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

//通过反编译,反编译一个类属性Field(了解)

public class ReflectTest06 {

public static void main(String[] args) {

//拼接字符串

StringBuilder stringBuilder = new StringBuilder();

//获得整个类的class

try {

Class studentClass = Class.forName(“javasetest.bean.Student”);

stringBuilder.append(Modifier.toString(studentClass.getModifiers()) + " class " + studentClass.getSimpleName() + “{”);

stringBuilder.append(“\n”);

Field[] fields = studentClass.getDeclaredFields();

for (Field field : fields){

stringBuilder.append(“\t”);

stringBuilder.append(Modifier.toString(field.getModifiers()));

stringBuilder.append(" ");

stringBuilder.append(field.getType().getSimpleName());

stringBuilder.append(" ");

stringBuilder.append(field.getName());

stringBuilder.append(“;”);

stringBuilder.append(“\n”);

}

stringBuilder.append(“}”);

System.out.println(stringBuilder);

//public class Student{

// public int no;

// private String name;

// protected int age;

// boolean sex;

//}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

(三)通过放射机制访问一个java对象的属性

import javasetest.bean.Student;

import java.lang.reflect.Field;

/*必须掌握:

  • 怎么通过放射机制访问一个java对象的属性?

  •   给属性赋值 set
    
  •   获取属性的值get
    
  • */

public class ReflectTest07 {

public static void main(String[] args) {

//不使用反射机制,怎么访问一个java对象的属性

Student student = new Student();

System.out.println(student.no);//0

student.no = 10;

System.out.println(student.no);//10

//使用反射机制

try {

Class studentClass = Class.forName(“javasetest.bean.Student”);

//实例化对象

Object object = studentClass.newInstance();//底层调用无参构造

//获取属性(根据属性名称)

Field noField = studentClass.getDeclaredField(“no”);

//给o对象(Student对象)的no属性赋值

/*

  • object : 对象 引用

  • field: 属性

  • 2222 : 字面量

  • 放射机制让代码复杂了,但是为了“灵活”

  • */

noField.set(object,222);

//读取属性的值

System.out.println(noField.get(object));//222

//试一下可不可以访问是有属性

Field nameField = studentClass.getDeclaredField(“name”);

//java.lang.IllegalAccessException:

// class javasetest.reflect.ReflectTest07

// cannot access a member of class javasetest.bean.Student with modifiers “private”

//如果没有下面这行代码

nameField.setAccessible(true);//打破封装

nameField.set(object,“钢铁侠”);

System.out.println(nameField.get(object));//可以访问私有属性

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

}

}

}

2.5 如何获取父类及类实现的接口

//给你一个类,怎么获取这个类的父类

public class ReflectTest13 {

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

//先获取本类

Class stringClass = Class.forName(“java.lang.String”);

//本类的父类

Class superClass = stringClass.getSuperclass();

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

蚂蚁、京东Java岗4面:原理+索引+底层+分布式+优化等,已拿offer

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

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

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

//先获取本类

Class stringClass = Class.forName(“java.lang.String”);

//本类的父类

Class superClass = stringClass.getSuperclass();

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

最后祝愿各位身体健康,顺利拿到心仪的offer!

由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里

[外链图片转存中…(img-Nr2F4GKp-1713578375319)]

[外链图片转存中…(img-Lbuxx5eF-1713578375319)]

[外链图片转存中…(img-1XVPqd8b-1713578375319)]

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值